mysql集群搭建二——CentOS搭建mysql-cluster集群

向右看齐 2022-05-31 03:06 471阅读 0赞

MySQL集群搭建(centos6.5)

注:系统(centos6.5)、集群版本(mysql-cluster-gpl-7.3.6-linux-glibc2.5-x86_64.tar.gz)

参考网站:

https://zhuanlan.zhihu.com/p/28572091

http://www.cnblogs.com/52php/p/5675374.html

http://blog.csdn.net/zhiyuan_2007/article/details/71238216

1、安装集群版本

a、准备工作

不管是Management Server,还是Data node、SQL node,都需要先安装MySQL集群版本,然后根据不用的配置来决定当前服务器有哪几个角色。

安装之前准备好mysql用户和mysql用户组,相关命令:

  1. groupadd mysql
  2. useradd mysql -g mysql

为了方便测试,确定相关机器的防火墙已关闭(或者设置防火墙这几台机器之间的网络连接是畅通无阻的),相关命令:

  1. chkconfig iptables off
  2. service iptables stop
b、安装集群版本

上传安装包至/usr/local目录下,并解压

  1. tar -zxvf mysql-cluster-gpl-7.3.6-linux-glibc2.5-x86_64.tar.gz

重命名文件夹

  1. mv mysql-cluster-gpl-7.3.6-linux-glibc2.5-x86_64 mysql

授权

  1. chown -R mysql:mysql mysql

切换mysql用户

  1. su - mysql

安装MySQL

  1. cd /usr/local/mysql
  2. scripts/mysql_install_db --user=mysql --datadir=/usr/local/mysql/data

注:所有服务器上都需要执行上述操作来安装MySQL集群版本。

2、集群配置

a、管理节点

root用户下,创建目录和配置文件

  1. mkdir /var/lib/mysql-cluster
  2. cd /var/lib/mysql-cluster
  3. vim config.ini

config.ini配置信息如下:

  1. [NDBD DEFAULT]
  2. NoOfReplicas=2
  3. [NDB_MGMD]
  4. #设置管理节点服务器
  5. nodeid=1
  6. HostName=10.16.8.193
  7. DataDir=/var/lib/mysql-cluster
  8. [NDBD]
  9. id=2
  10. HostName=10.16.8.193
  11. DataDir=/usr/local/mysql/data
  12. [NDBD]
  13. id=3
  14. HostName=10.16.8.194
  15. DataDir=/usr/local/mysql/data
  16. [MYSQLD]
  17. id=4
  18. HostName=10.16.8.193
  19. [MYSQLD]
  20. id=5
  21. HostName=10.16.8.194
  22. #必须有空的mysqld节点,不然数据节点断开后启动有报错
  23. [MYSQLD]
  24. id=6
  25. [mysqld]
  26. id=7

授权

  1. chown -R mysql:mysql /var/lib/mysql-cluster

切换用户

  1. su - mysql

启动管理服务

  1. /usr/local/mysql/bin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini --initial

注:命令行中的ndb_mgmd是mysql cluster的管理服务器,后面的-f表示后面的参数是启动的参数配置文件。

如果在启动后过了几天又添加了一个数据节点,这时修改了配置文件启动时就必须加上–initial参数,不然添加的节点不会作用在mysql cluster中。

b、数据节点

编辑/etc/my.cnf文件

  1. # vim /etc/my.cnf
  2. [mysqld]
  3. sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
  4. datadir=/usr/local/mysql/data
  5. socket=/var/lib/mysql/mysql.sock
  6. user=mysql
  7. default-storage-engine=ndbcluster
  8. ndbcluster
  9. ndb-connectstring=10.16.8.193
  10. character_set_server=utf8
  11. lower_case_table_names=1
  12. [mysql_cluster]
  13. ndb-connectstring=10.16.8.19

切换用户

  1. su - mysql

启动数据节点服务

  1. /usr/local/mysql/bin/ndbd --initial

注:第一次启动需要加参数:–initial,以后就不用加了,直接运行: /usr/local/mysql/bin/ndbd

这个参数尤其重要,因为加了–initial后会把数据库清空的

c、SQL节点

编辑/etc/my.cnf文件(数据节点和SQL节点在统一服务器时可省略)

  1. # vim /etc/my.cnf
  2. [mysqld]
  3. sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
  4. datadir=/usr/local/mysql/data
  5. socket=/var/lib/mysql/mysql.sock
  6. user=mysql
  7. ndbcluster
  8. ndb-connectstring=192.168.3.115
  9. [mysql_cluster]
  10. ndb-connectstring=192.168.3.115

复制mysqld到系统服务里面去

  1. cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

切换用户

  1. su - mysql

启动数据节点服务

  1. service mysqld start /usr/local/mysql/bin/mysqladmin -u root password 'password'
d、完成效果
  1. ndb_mgm> show
  2. Connected to Management Server at: localhost:1186
  3. Cluster Configuration
  4. ---------------------
  5. [ndbd(NDB)] 2 node(s)
  6. id=2 @192.168.3.116 (mysql-5.6.19 ndb-7.3.6, Nodegroup: 0, *)
  7. id=3 @192.168.3.117 (mysql-5.6.19 ndb-7.3.6, Nodegroup: 0)
  8. [ndb_mgmd(MGM)] 1 node(s)
  9. id=1 @192.168.3.115 (mysql-5.6.19 ndb-7.3.6)
  10. [mysqld(API)] 4 node(s)
  11. id=4 @192.168.3.116 (mysql-5.6.19 ndb-7.3.6)
  12. id=5 @192.168.3.117 (mysql-5.6.19 ndb-7.3.6)
  13. id=6 (not connected, accepting connect from any host)
  14. id=7 (not connected, accepting connect from any host)

3、nginx方向代理

因为需要使用nginx的tcp连接,所以需要使用到nginx的stream模块

a、安装nginx

因为是使用rpm方式进行安装,下面给出官方的依赖包下载地址:

http://vault.centos.org/6.5/os/x86_64/Packages/

在上面网站中安装必要依赖,比如gcc gcc-c++ automake autoconf libtool make glibc glibc-devel lsof ,具体需要的依赖到时安装时会提示错误,再安装即可,安装命令:

  1. rpm -ivh xxx.rpm

官网下载nginx,这里我使用的是如下的版本:

  1. nginx-1.12.2.tar.gz

解压:

  1. tar zxvf nginx-1.12.2.tar.gz

进入目录:

  1. cd nginx-1.12.2

源码编译:

  1. ./configure with-stream

注:这里如果报错,一般是缺少某个依赖,去centos依赖库下载回来执行rpm命令安装即可

安装:

  1. make
  2. make install

执行命令查看到的版本和依赖模块如下:

  1. [root@kfjqrapp1 sbin]# ./nginx -V
  2. nginx version: nginx/1.12.2
  3. built by gcc 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC)
  4. configure arguments: --prefix=/home/xxx/nginx --with-stream
b、nginx.conf配置文件如下:
  1. #user nobody;
  2. user root;
  3. worker_processes auto;
  4. #error_log /var/log/nginx/error.log;
  5. #pid /var/run/nginx.pid;
  6. error_log logs/error.log;
  7. error_log logs/error.log notice;
  8. error_log logs/error.log info;
  9. pid logs/nginx.pid;
  10. events {
  11. worker_connections 1024;
  12. }
  13. stream {
  14. upstream mysqld {
  15. server 10.16.8.193:3306 weight=4 max_fails=3 fail_timeout=30s;
  16. server 10.16.8.194:3306 weight=5 max_fails=3 fail_timeout=30s;
  17. }
  18. server {
  19. listen 3306;
  20. proxy_connect_timeout 30s;
  21. proxy_timeout 43200s;
  22. proxy_pass mysqld;
  23. }
  24. }
  25. http {
  26. include mime.types;
  27. default_type application/octet-stream;
  28. #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  29. # '$status $body_bytes_sent "$http_referer" '
  30. # '"$http_user_agent" "$http_x_forwarded_for"';
  31. #access_log logs/access.log main;
  32. sendfile on;
  33. #tcp_nopush on;
  34. #keepalive_timeout 0;
  35. keepalive_timeout 65;
  36. max_ranges 1;
  37. upstream myproject {
  38. server 10.16.8.191:8082;
  39. server 10.16.8.192:8082;
  40. }
  41. server {
  42. listen 9300;
  43. server_name localhost;
  44. location / {
  45. proxy_pass http://myproject;
  46. }
  47. }
  48. #gzip on;
  49. server {
  50. listen 80;
  51. server_name localhost;
  52. #charset koi8-r;
  53. #access_log logs/host.access.log main;
  54. max_ranges 1;
  55. location / {
  56. root html;
  57. index index.html index.htm;
  58. max_ranges 1;
  59. }
  60. #error_page 404 /404.html;
  61. # redirect server error pages to the static page /50x.html
  62. #
  63. error_page 500 502 503 504 /50x.html;
  64. location = /50x.html {
  65. root html;
  66. max_ranges 1;
  67. }
  68. # proxy the PHP scripts to Apache listening on 127.0.0.1:80
  69. #
  70. #location ~ \.php$ {
  71. # proxy_pass http://127.0.0.1;
  72. #}
  73. # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
  74. #
  75. #location ~ \.php$ {
  76. # root html;
  77. # fastcgi_pass 127.0.0.1:9000;
  78. # fastcgi_index index.php;
  79. # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
  80. # include fastcgi_params;
  81. #}
  82. # deny access to .htaccess files, if Apache's document root
  83. # concurs with nginx's one
  84. #
  85. #location ~ /\.ht {
  86. # deny all;
  87. #}
  88. }
  89. # another virtual host using mix of IP-, name-, and port-based configuration
  90. #
  91. #server {
  92. # listen 8000;
  93. # listen somename:8080;
  94. # server_name somename alias another.alias;
  95. # location / {
  96. # root html;
  97. # index index.html index.htm;
  98. # }
  99. #}
  100. # HTTPS server
  101. #
  102. #server {
  103. # listen 443 ssl;
  104. # server_name localhost;
  105. # ssl_certificate cert.pem;
  106. # ssl_certificate_key cert.key;
  107. # ssl_session_cache shared:SSL:1m;
  108. # ssl_session_timeout 5m;
  109. # ssl_ciphers HIGH:!aNULL:!MD5;
  110. # ssl_prefer_server_ciphers on;
  111. # location / {
  112. # root html;
  113. # index index.html index.htm;
  114. # }
  115. #}
  116. }

注:这里要注意的是proxy_timeout 43200s;这个参数,代表tcp连接之后再这个秒数之内,如果不进行通讯,那么会自动断开连接,这个就看看实际项目的需求了,一般看一下定时任务的时间来定。

4、常用命令以及问题整理

1) ndb_mgmd管理命令:/usr/local/mysql/bin/ndb_mgm执行之后就是管理控制台了,里面可以继续输入命令。(具体命令可以使用help查看)

2) 停止集群服务器的命令:/usr/local/mysql/bin/ndb_mgm -e shutdown

如果集群配置有更新了:rm /usr/local/mysql/mysql-cluster/ndb_1_config.bin.1

3) 停止SQL节点的命令:/usr/local/mysql/bin/mysqladmin -uroot shutdown

4)使用需要注意如下几点:

a、表必须用ENGINE=NDB或ENGINE=NDBCLUSTER选项创建,或用ALTER TABLE选项更改,以使用NDB Cluster存储引擎在 Cluster内复制它们。如果使用mysqldump的输出从已有数据库导入表,可在文本编辑器中打开SQL脚本,并将该选项添加到任何表创建语句,或 用这类选项之一替换任何已有的ENGINE(或TYPE)选项。

b、另外还请记住,每个NDB表必须有一个主键。如果在创建表时用户未定义主键,NDB Cluster存储引擎将自动生成隐含的主键。(注释:该隐含 键也将占用空间,就像任何其他的表索引一样。由于没有足够的内存来容纳这些自动创建的键,出现问题并不罕见)。

c、再重启mysql-cluster的时候,在重启数据节点的时候注意看一下是不是已经启动了,才开始启动最后的sql节点,有时数据量比较大的时候,启动数据节点需要一段时间的,使用show命令查看如果是数据节点有starting标识的话,那就是还没启动成功:

  1. id=2 @192.168.0.15 (mysql-5.7.18 ndb-7.5.6, starting, Nodegroup: 0)
问题一:

ERROR 1297 (HY000): Got temporary error 233 ‘Out of operation records in transaction coordinator (increase MaxNoOfConcurrentOperations)’ from NDBCLUSTER

在[NDBD DEFAULT]中增加参数

  1. MaxNoOfConcurrentOperations=300000
  2. MaxNoOfLocalOperations=330000
问题二:

java.net.UnknownHostException: XXXX Name or service not known

修改/etc/hosts文件

  1. 127.0.0.1 主机名 localhost.localdomain localhost

或是再添加一条

  1. 127.0.0.1 主机名
问题三:

对于连表查询,mysql-cluster性能比较差,这里还没想到怎么优化,但是如果是带有IN的sql语句,可以通过如下方式进行优化:

下面语句执行可能要很长时间:

  1. select * from userinfo where id in(select author_id from artilce where type=1);

可以进行如下的优化(使用临时表):

  1. select id,username from userinfo where id in (select author_id from article where type = 1);
问题四:

Node 1: Forced node shutdown completed. Caused by error 2305: ‘Node lost connection to other nodes and can not form a unpartitioned cluster, please investigate if there are error(s) on other node(s)(Arbitration error). Temporary error, restart node’.

config.ini,在[ndbd]中改一个参数为StopOnError=0即可.

问题五:导入数据的时候遇到如下报错

ERROR 1005 (HY000) at line 25: Can’t create table ‘tuge.pangolin_fnc_accountverification’ (errno: 140)
Error | 1296 | Got error 738 ‘Record too big’ from NDB

分析原因:表行数据太大

解决办法:需要更改表结构,使最大单行数据的大小小于8KB!

问题六:导入大量数据的时候遇到如下报错

Error 1297: Got temporary error ‘REDO’ log overloaded.
ERROR : Got temporary error 1204 ‘Temporary failure, distribution changed’ from NDBCLUSTER
ERROR : Got temporary error 1234 ‘REDO log files overloaded (increase disk hardware)’ from NDBCLUSTER

分析原因:遇到这个错误,是表示redo log用完了,需要增加

解决办法:修改config.ini文件,更改或添加如下参数:

  1. FragmentLogFileSize=256M
  2. NoOfFragmentLogFiles=16

NoOfFragmentLogFiles这个参数可以更改到更大,但是初始化的时候会慢一点

问题七:在导入大量数据的时候,出现如下报错:

ERROR 1114 (HY000) at line 54: The table ‘gps_led_sendadverthistory’ is full

分析原因:你分配的内存或者硬盘空间已经用完(如果你采用磁盘表的话),需要通过ndb管理节点客户端和登录mysql查看具体的原因,通过ndb_mgm登录,执行命令:

All report memory 看下分配的内存是否使用完,如果采用磁盘表的,还需要登录mysqld节点,然后执行如下查询,来确定是否是磁盘不足:

  1. SELECT TABLESPACE_NAME, FILE_NAME, EXTENT_SIZE*TOTAL_EXTENTS/1024/1024 AS TOTAL_MB, EXTENT_SIZE*FREE_EXTENTS/1024/1024 AS FREE_MB, EXTRA FROM information_schema.FILES WHERE FILE_TYPE="DATAFILE";

解决办法:如果是数据内存不足的情况,直接更改文件config.ini中[NDBD DEFAULT]下的

  1. DataMemory=11480M
  2. IndexMemory=1024M

5、在网上查询到的优化配置

config.ini

  1. [ndb_mgmd default]
  2. DataDir = /usr/local/mysql/data
  3. [ndbd default]
  4. NoOfReplicas = 2
  5. DataMemory = 2500M
  6. IndexMemory = 800M
  7. DataDir = /usr/local/mysql/data
  8. StringMemory = 50
  9. MaxNoOfTables = 4096
  10. MaxNoOfOrderedIndexes = 2048
  11. MaxNoOfUniqueHashIndexes = 1024
  12. MaxNoOfAttributes = 24576
  13. MaxNoOfTriggers = 10240
  14. MaxNoOfConcurrentTransactions = 409600
  15. MaxNoOfConcurrentOperations = 3276800
  16. ###MaxNoOfLocalOperations = 55000
  17. TimeBetweenGlobalCheckpoints = 1000
  18. TimeBetweenEpochs = 100
  19. TimeBetweenWatchdogCheckInitial = 60000
  20. TransactionBufferMemory = 20M
  21. DiskCheckpointSpeed = 20M
  22. DiskCheckpointSpeedInRestart = 100M
  23. TimeBetweenLocalCheckpoints = 20
  24. SchedulerSpinTimer = 400
  25. SchedulerExecutionTimer = 100
  26. RealTimeScheduler = 1
  27. BackupMaxWriteSize = 2M
  28. BackupDataBufferSize = 32M
  29. BackupLogBufferSize = 8M
  30. BackupMemory = 40M
  31. MaxNoOfExecutionThreads = 4
  32. TransactionDeadLockDetectionTimeOut = 15000
  33. BatchSizePerLocalScan = 512
  34. ###Increasing the LongMessageBufferb/c of a bug (20090903)
  35. LongMessageBuffer = 16M
  36. ###Heartbeating
  37. HeartbeatIntervalDbDb = 15000
  38. HeartbeatIntervalDbApi = 15000
  39. FragmentLogFileSize = 256M
  40. NoOfFragmentLogFiles = 16
  41. [mysqld default]
  42. [ndb_mgmd]
  43. NodeId = 1
  44. HostName = 172.16.10.160
  45. [ndbd]
  46. NodeId = 11
  47. HostName = 172.16.10.170
  48. [ndbd]
  49. NodeId = 12
  50. HostName = 172.16.10.171
  51. [ndbd]
  52. NodeId = 13
  53. HostName = 172.16.10.172
  54. [ndbd]
  55. NodeId = 14
  56. HostName = 172.16.10.173
  57. [mysqld]
  58. NodeId = 81
  59. HostName = 172.16.10.150
  60. [mysqld]
  61. NodeId = 82
  62. HostName = 172.16.10.151

my.cnf

  1. [mysqld]
  2. basedir = /usr/local/mysql
  3. datadir = /usr/local/mysql/data
  4. default-storage-engine = ndbcluster
  5. slow-query-log = on
  6. slow_query_log_file = /usr/local/mysql/data/slow-query.log
  7. long_query_time = 5
  8. skip-external-locking
  9. key_buffer_size = 600M
  10. max_allowed_packet = 100M
  11. table_open_cache = 2048
  12. sort_buffer_size = 1024M
  13. net_buffer_length = 8K
  14. read_buffer_size = 400M
  15. read_rnd_buffer_size = 200M
  16. lower_case_table_names =1
  17. back_log = 384
  18. thread_stack = 256K
  19. join_buffer_size = 500M
  20. thread_cache_size = 200
  21. query_cache_size = 640M
  22. tmp_table_size = 256M
  23. max_connections = 5000
  24. max_connect_errors = 10000000
  25. wait_timeout = 2880000
  26. interactive_timeout = 2880000
  27. thread_concurrency = 8
  28. ndbcluster
  29. ndb-connectstring = 172.16.10.160
  30. [mysql_cluster]
  31. ndb-connectstring = 172.16.10.160

发表评论

表情:
评论列表 (有 0 条评论,471人围观)

还没有评论,来说两句吧...

相关阅读

    相关 VirtualBoxCentOS

    搭建集群目的:为了搭建大数据集群环境 和 微服务(SpringCloud)集群练习; 一、前期调查 本来想直接使用某里、某讯、某为的云产品,无奈,发现配置太低而且贵,而