搭建本地和容器版MySQL主从集群
【首先】关闭防火墙:
[root@s1 master]# setenforce 0
[root@s1 master]# systemctl stop firewalld; iptables –F
1. 搭建本地mysql主从集群
-
安装mysql,分别在master节点和node1和node2节点操作。
[root@s1 mysql]# wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz
-
创建mysql系统用户和组。
[root@s1 mysql]# groupadd mysql [root@s1 mysql]# useradd -r -g mysql mysql [root@s1 mysql]# passwd mysql Changing password for user mysql. New password: BAD PASSWORD: The password is shorter than 8 characters Retype new password: passwd: all authentication tokens updated successfully.
-
解压和迁移mysql安装包至/usr/local
[root@s1 mysql]# mv mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz /usr/local/ [root@s1 mysql]# cd /usr/local/ [root@s1 local]# ls bin etc games include lib lib64 libexec mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz sbin share src [root@s1 local]# tar xvf mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz
[root@s1 local]# tar zxvf mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz
移除mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz -
修改mysql-5.7.22-linux-glibc2.12-x86_64为mysql,并在mysql/support-files下创建my.cnf配置文件,修改文件内容,将其复制到/etc/my.cnf,复制mysql.server至/etc/init.d/mysql。
[root@s1 local]# mv mysql-5.7.22-linux-glibc2.12-x86_64/ mysql [root@s1 local]# cd ./mysql/support-files/ [root@s1 support-files]# vi my.cnf
[root@s1 support-files]# cp my.cnf /etc/my.cnf cp: overwrite ‘/etc/my.cnf’? y [root@s1 support-files]# cp mysql.server /etc/init.d/mysql
-
配置参数并初始化
[root@s1 mysql]# bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
记住最后一行的临时密码bbTBKTdoL4!K。
指定数据位置:
[root@s1 mysql]# bin/mysql_ssl_rsa_setup --datadir=/usr/local/mysql/data
-
启动mysql,并修改密码为123456,输入的密码即为之前的临时密码,查看user数据。
[root@s1 bin]# ./mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.7.22-log Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement mysql> set password=password('123456'); Query OK, 0 rows affected, 1 warning (0.01 sec) mysql> use mysql Database changed mysql> select host,user from user; +-----------+---------------+ | host | user | +-----------+---------------+ | localhost | mysql.session | | localhost | mysql.sys | | localhost | root | +-----------+---------------+ 3 rows in set (0.00 sec) mysql> exit Bye
-
配置mysql自动启动
# chmod 755 /etc/init.d/mysql # chkconfig --add mysql # chkconfig --level 345 mysql on
启动mysql:service mysql start。
至此,mysql安装基本完成。
-
配置主从同步数据库。
系统: centOS 7
Master:192.168.5.101(主) node1:192.168.5.102(从) node2:192.168.5.103(从)
(1)配置主数据库,修改master的mysql配置文件my.cnf,在mysqlId下添加以下字段。#保证唯一 server_id=1 # 开启二进制日志 log-bin=mysql-bin
(2)给从服务器创建访问用户slave,密码为123456,并刷新权限。
mysql> grant replication slave on *.* to 'slave'@'%' identified by '123456'; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) 显示用户: mysql> use mysql; Database changed mysql> select host,user from user; +---------------+---------------+ | host | user | +---------------+---------------+ | % | slave | | localhost | mysql.session | | localhost | mysql.sys | | localhost | root | +---------------+---------------+ 7 rows in set (0.00 sec)
(3)重启mysql服务
service mysql restart
(4)配置从服务器,node1的server-id为2,node2的server-id为3。
登录mysql执行以下步骤:mysql> CHANGE MASTER TO -> Master_Host='192.168.5.101', #master主机IP -> Master_User='slave', #创建的user用户 -> Master_Password='123456', -> Master_Port=3306; Query OK, 0 rows affected, 2 warnings (0.12 sec)
查看slave状态:
mysql>show slave status\G
重点看slave_io_running和 slave_sql_runnin两项都为yes
(5)在master处创建新的数据库db1,在node1和node2处查看是否同步。
主数据库:
从数据库:
本地mysql主从数据库搭建完成。
2. 使用docker搭建mysql主从集群
-
使用docker将mysql:5.7.22下载到本地。
pull mysql到本地,命令如下:
docker pull mysql:5.7.22
-
在主机下面新增master.cnf和slave.cnf配置文件
主要字段为:
log-bin = mysql-bin server-id = 1(server-id = 2)
-
运行容器
启动master容器:
[root@s1 ~]# docker run -p 3306:3306 --name master -v /root/master.cnf:/etc/mysql/conf.d /master.cnf -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.22 fe5dd2ab42ee4d27958f6dfc0b6db77d12011902c6d26e16b6f08e4efac53316
启动slave容器:
[root@s1 ~]# docker run -p 3307:3306 --name slave -v /root/slave.cnf:/etc/mysql /conf.d/slave.cnf -e MYSQL_ROOT_PASSWORD=123456-d mysql:5.7.22 Initializing database 2019-03-20T08:53:58.237323Z 0 [Warning] 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. ……
查看运行中的容器
-
进入容器中,命令如下:
进入到slave容器中:
[root@s1 ~]# docker exec -i -t 84cda6591a7e /bin/bash
进入到master容器中:[root@s1 ~]# docker exec -i -t fe5dd2ab42ee /bin/bash
-
进入master的mysql,查看数据库状态。
创建用户slave1并赋予权限,密码为123456。mysql> GRANT ALL PRIVILEGES ON *.* TO slave1@'%' IDENTIFIED BY 123456; FLUSH PRIVILEGES;
-
进入slave数据库中配置主从关系关联:
mysql> change master to -> master_host='192.168.5.101', -> master_port=3306, -> master_user='slave1', -> master_password='123456'; Query OK, 0 rows affected, 2 warnings (0.03 sec)
并查看同步状态:
可以看到Slave_IO_Running和Slave_SQL_Running选项都为yes。 -
测试是否搭建成功:
Master创建db1数据库,查看slave节点是否同步。
搭建成功。
3. 注意
- 不同步原因,master_host需要使用master节点的IP,master_user使用赋予权限的user名。
- 配置文件server-id不能相同
- 配置文件的同步数据库不用指定,可以不加指定库。