MySQL Galera集群搭建

时间:2022-09-19 19:50:34

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)

此时两个节点都有数据,测试成功。