MySQL Galera集群搭建
一 搭建
1、配置的方法:mysql集群的主主同步方式,搭建建的是两个节点的集群,可以在线自增和剔除,一般来说节点配置过程中要求的做法和参数等大致相同,所以在搭建时有两种方法:一是配置好一个节点,然后复制这个节点成为另一个节点,修改某些不同的参数,比如IP地址,主机名,galera配置过程中要求的连接方式等等;二是一个节点一个节点的配置,这样便于在过程中完成测试,比如两节点是否通信,握手等等,如遇到问题可以方便的知道问题的所在。
2、配置的环境:redhat6.4 64位
galera-25.3.2-1.rhel6.x86_64.rpm
MySQL-server-5.6.14_wsrep_25.1-1.rhel6.x86_64.rpm
MySQL-client-5.6.15-1.el6.x86_64.rpm
MySQL-shared-5.6.15-1.el6.x86_64.rpm
3、检查系统是否自带mysql已安装
[root@jianwei1 ~]# rpm -qa |grep mysql
如有全部卸载[root@jianwei1 ~]# rpm -e --nodeps包名
4、安装集群软件并检查是否安装成功
[root@jianwei1 ~]# rpm -Uhv galera-25.3.2-1.rhel6.x86_64.rpm
[root@jianwei1 ~]# rpm -Uhv MySQL-client-5.6.15-1.el6.x86_64.rpm
[root@jianwei1 ~]# rpm -Uhv mysql/MySQL-shared-5.6.15-1.el6.x86_64.rpm
[root@jianwei1 ~]# rpm -Uhv MySQL-server-5.6.14_wsrep_25.1-1.rhel6.x86_64.rpm
在安装最后一个软件时会出现welcome mysql的字样时就表示成功,如若不放心可以在检查
[root@jianwei1 ~]# rpm -qa |grep MySQL
MySQL-shared-5.6.15-1.el6.x86_64
MySQL-client-5.6.15-1.el6.x86_64
MySQL-server-5.6.14_wsrep_25.1-1.rhel6.x86_64
5、第一次登陆MYSQL,修改mysql root密码
[root@jianwei1 ~]# mysqladmin -u root password 'rootpass'
mysqladmin: connect to server at 'localhost' failed
error: 'Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)'
Check that mysqld is running and that the socket: '/var/lib/mysql/mysql.sock' exists!
1)想到mysql服务是否启动
[root@jianwei ~]# /etc/init.d/mysql status
MySQL is not running [失败]
[root@jianwei ~]# /etc/init.d/mysql restart
MySQL server PID file could not be found! [失败]
Starting MySQL..... [确定]
2)在运行修改密码的命令,还是报错
mysqladmin: connect to server at 'localhost' failed
error: 'Access denied for user 'root'@'localhost' (using password: NO)'
是因为没有安装mysql-server软件,它要走认证权限协议,如有问题以及以后安装维护过程出现错误,可以直接查看err日志,找到病根,先找到这个日志放在哪个目录下
[root@jianwei1 ~]# find / -name *.err
/var/lib/mysql/jianwei1.test.com.err
3)那就直接跳过这一步
[root@jianwei ~]# mysqld_safe --skip-grant-tables &
等到光标在原处闪动不前进时输入
mysql -uroot -p
这样会到达mysql命令行界面
mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> update user set password=PASSWORD("rootpass")where user="root";
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4 Changed: 4 Warnings: 0
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> quit
Bye
这样就行啦,再次重启mysql服务就可以了。
6、这一步是为了实现wsrep架构而进行的用户(root,SST)创建、删除工作
[root@jianwei1 ~]# mysql -uroot -p
进入mysql主页面,进行操作
1)删除空用户
mysql> delete from mysql.user where user='';
ERROR 1820 (HY000): You must SET PASSWORD before executing this statement
这个错误提醒要设置root密码,因为你第一次修改了登陆root账号的密码,但是mysql还没有知道,所以要重新告诉它一下
mysql> set password=password("rootpass");
Query OK, 0 rows affected (0.00 sec)
再次运行删除空用户命令就会成功
2)创建root@% user
mysql> grant usage on *.* to root@'%' identified by 'rootpass';
3)通知所有的节点更新了root密码
mysql> UPDATE mysql.user SET Password=PASSWORD('rootpass') WHERE User='root';
4)创建SST账号是为了节点通信之间的连接,SST账号是galera集群的一个必须的用户
mysql> GRANT USAGE ON *.* to sst@'%' IDENTIFIED BY 'sstpass123';
5)给两个账号权限
mysql> GRANT ALL PRIVILEGES on *.* to sst@'%';
mysql> GRANT ALL PRIVILEGES on *.* to root@'%';
至此完成wsrep架构准备工作。
7、确认galera库文件是否存在
[root@jianwei1 ~]# updatedb
[root@jianwei1 ~]# locate libgalera /usr/lib64/galera/libgalera_smm.so
8、配置wsrep.cnf文件,很重要的一步,这个文件用来完成另一个节点通信于它的凭证
1)首先将文件放置/etc配置目录下,这个是默认路径,创建新的文件夹
[root@jianwei1 ~]# mkdir -p /etc/mysql/conf.d/
2)拷贝wsrep.cnf文件至此目录下
[root@jianwei1 ~]#cp /usr/share/doc/MySQL-server-5.6.14_wsrep_25.1/wsrep /etc/mysql/conf.d/
3)修改wsrep配置文件中一些参数
bind-address=172.26.1.81
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_name="controller_cluster" #这个参数可改可不改
wsrep_cluster_address="gcomm://"
wsrep_sst_auth=sst:sstpass123
9、修改防火墙添加3306(mysql)和4567(wsrep)两个端口
[root@jianwei1 ~]# iptables -A INPUT -i eth0 -p tcp -m tcp --source 172.26.1.81 --dport 3306 -j ACCEPT
[root@jianwei1 ~]# iptables -A INPUT -i eth0 -p tcp -m tcp --source 172.26.1.81 --dport 4567 -j ACCEPT
10、修改mysql配置文件使其包含wsrep.cnf文件
可以在安装目录下直接修改,也可以再重新在/etc下创建此文件my.cnf
在文件中添加:!includedir /etc/mysql/conf.d/
11、为了保证修改的配置等生效,重启mysql服务
[root@jianwei1 ~]# /etc/init.d/mysql restart
12、此时可以查看3306和4567端口是否开启
[root@jianwei1 ~]# netstat -tulpn | grep -e 4567 -e 3306
至此,第一个节点已经完成。
配置第二个节点,不管你用哪种方法,我们只需要修改某些配置就行
1、修改wsrep配置文件
bind-address=172.26.1.82
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_name="controller_cluster" #这个参数可改可不改
wsrep_cluster_address="gcomm://172.26.1.81"
wsrep_sst_auth=sst:sstpass123
2、修改3306和4567端口
[root@jianwei ~]# iptables -A INPUT -i eth0 -p tcp -m tcp --source 172.26.1.82 --dport 3306 -j ACCEPT
[root@jianwei ~]# iptables -A INPUT -i eth0 -p tcp -m tcp --source 172.26.1.82 --dport 4567 -j ACCEPT
3、重启mysql服务
这时服务启动不了,我感到很奇怪,配置过程都是一样的,于是查看err日志文件,看看报什么错误,
1)是时间戳超时,连接不上;
2)InnoDB: The log sequence numbers 1626705 and 1626705 in ibdata files do not match the log sequence number 1626869 in the ib_logfiles!就是说与另一个节点匹配不上,sst账号没有作用
解决思想:
第一步:想到的是端口是否成功开始,查看是显示3306端口启动了,而4567端口不能连接,并且状态是连接超时;
第二步:竟然这样我就怀疑自己是否哪一步没有配置好,将wsrep配置文件中的
wsrep_cluster_address="gcomm://172.26.1.81"
修改为
wsrep_cluster_address="gcomm://"
重启mysql服务查看一切正常,这样我就确认不是我的配置错误
第三步:所有配置都正常,想了很久,连接超时,SST用户不能相互握手,我就想到是否跟网络有关,好像也只有这一点了
查看iptables参数,果不其然,防火墙都已经开启,于是关闭防火墙和seLinux
终于可以看到4567端口开通了
[root@jianwei1 ~]# netstat -an| grep :4567
tcp 0 0 0.0.0.0:4567 0.0.0.0:* LISTEN
tcp 0 0 172.26.1.82:51906 172.26.1.81:4567 ESTABLISHED
至此配置过程全部完成。
二 测试
第一个节点
1)mysql> show status like "wsrep%";(查看wsrep信息)
+------------------------------+--------------------------------------+
| Variable_name | Value |
+------------------------------+--------------------------------------+
| wsrep_local_state_uuid | b3c5837c-c5bc-11e3-9551-c7294651e52c |
| wsrep_protocol_version | 5 |
| wsrep_last_committed | 0 |
| wsrep_replicated | 0 |
| wsrep_replicated_bytes | 0 |
| wsrep_repl_keys | 0 |
| wsrep_repl_keys_bytes | 0 |
| wsrep_repl_data_bytes | 0 |
| wsrep_repl_other_bytes | 0 |
| wsrep_received | 16 |
| wsrep_received_bytes | 1295 |
| wsrep_local_commits | 0 |
| wsrep_local_cert_failures | 0 |
| wsrep_local_replays | 0 |
| wsrep_local_send_queue | 0 |
| wsrep_local_send_queue_avg | 0.500000 |
| wsrep_local_recv_queue | 0 |
| wsrep_local_recv_queue_avg | 0.000000 |
| wsrep_local_cached_downto | 18446744073709551615 |
| wsrep_flow_control_paused_ns | 0 |
| wsrep_flow_control_paused | 0.000000 |
| wsrep_flow_control_sent | 0 |
| wsrep_flow_control_recv | 0 |
| wsrep_cert_deps_distance | 0.000000 |
| wsrep_apply_oooe | 0.000000 |
| wsrep_apply_oool | 0.000000 |
| wsrep_apply_window | 0.000000 |
| wsrep_commit_oooe | 0.000000 |
| wsrep_commit_oool | 0.000000 |
| wsrep_commit_window | 0.000000 |
| wsrep_local_state | 4 |
| wsrep_local_state_comment | Synced |
| wsrep_cert_index_size | 0 |
| wsrep_causal_reads | 0 |
| wsrep_incoming_addresses | 172.26.1.81:3306,172.26.1.82:3306 |
| wsrep_cluster_conf_id | 6 |
| wsrep_cluster_size | 2 |
| wsrep_cluster_state_uuid | b3c5837c-c5bc-11e3-9551-c7294651e52c |
| wsrep_cluster_status | Primary |
| wsrep_connected | ON |
| wsrep_local_bf_aborts | 0 |
| wsrep_local_index | 0 |
| wsrep_provider_name | Galera |
| wsrep_provider_vendor | Codership Oy <info@codership.com> |
| wsrep_provider_version | 25.3.2(r170) |
| wsrep_ready | ON |
+------------------------------+--------------------------------------+
46 rows in set (0.01 sec)
2)mysql> show databases;(看是否有数据库)
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in set (0.00 sec)
3)mysql> use test;
4)mysql> show tables;
Empty set (0.00 sec)
5)mysql> create table test (name varchar(5));
Query OK, 0 rows affected (0.52 sec)
6)在第二个节点查看是否有该表
mysql> use test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| test |
+----------------+
1 row in set (0.00 sec)
mysql> select * from test;
Empty set (0.00 sec)
7)在第一个节点上
mysql> insert into test values ('jianw');
Query OK, 1 row affected (0.03 sec)
8)第二个节点查看
mysql> select * from test;
+-------+
| name |
+-------+
| jianw |
+-------+
1 row in set (0.00 sec)
mysql> insert into test values ('cninf');
Query OK, 1 row affected (0.06 sec)
9)第一个节点
mysql> select * from test;
+-------+
| name |
+-------+
| jianw |
| cninf |
+-------+
2 rows in set (0.00 sec)
此时两个节点都有数据,测试成功。