背景
大部分搭建mysql集群着重于集群本身,很少谈到安装mysql,尤其是在测试环境,服务器可能已经存在mysql的情况下;所以今天留下这个笔记。
集群采用主从结构,实现读写分离,分担了读操作对库的压力;但是存在master单点问题,数据一致性(同步延迟问题)。
搭建mysql集群
- 首先要关闭防火墙
systemctl stop firewalld
- 清空防火墙策略,关闭selinux(selinux是linux的安全子系统,它主要的作用是最大限度减少系统可访问资源;对安全性要求不高,可以关掉)
iptables -F && setenforce
- 开始安装mysql
因为集群线上要用到,线上连接不到外网,所以采用安装包的方式进行安装,my.cnf也是提前准备好的。
(1) 解压
将解压完的文件夹放到需要的位置,这里放到了/usr/local/mysql下
(2) 创建mysql用户
su root
groupadd mysql
Useradd -r -g mysql mysql
passwd mysql
passwd mysql 配置密码
赋权限
chown -R mysql:mysql /usr/local/mysql
(3) 创建需要的文件(注意:解压出来的文件必须放在/usr/local/mysql/下面,my.cnf必须放在/etc/下面;等待分析具体原因。解答上述问题:可以通过mysql帮助【 mysql --help| grep my.cnf】看到,有一个扫描配置文件的默认顺序:/etc/mysql/my.cnf,/etc/my.cnf ~/.my.cnf order of preference, my.cnf, $MYSQL_TCP_PORT, --2021.1.15)
创建mysql.sock文件(注:这里的文件目录根据需要配置)
su root
cd /tmp
touch mysql.sock
chown mysql:mysql mysql.sock
chmod 755 mysql.sock
创建文件/tmp/mysqld/mysqld.pid(注:这里的文件目录根据需要配置)
mkdir mysqld
touch /tmp/mysqld/mysqld.pid
chown -R mysql:mysql /tmp/mysqld
chmod 755 /tmp/mysqld/mysqld.pid
创建文件 /var/log/mysqld.log
touch /var/log/mysqld.log
chown -R mysql:mysql /var/log/mysqld.log
chmod 755 /var/log/mysqld.log
复制my.cnf文件(注:文件的路径根据需要配置,但是里面的配置要根据上述的路径进行修改)
cp /home/sky/soft/my.cnf /etc/
chown -R mysql:mysql /etc/my.cnf
chmod 755 /etc/my.cnf
(4)初始化数据库
以空密码形式进行初始化(具体的路径根据需要配置)
su root
ln -s /usr/local/mysql/bin/mysqld /usr/bin/mysqld
ln -s /usr/local/mysql/bin/mysqld_safe /usr/bin/mysqld_safe
(5) 启动数据库
su mysql
(注意,这里需要指定配置文件的路径,否则mysql会按照默认配置文件的顺序进行加载)
./bin/mysqld --defaults-file=/etc/my-test.cnf --initialize-insecure --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/ --user=mysql
(启动)
mysqld_safe --defaults-file=/etc/my-test.cnf &
(6) 进入数据库,修改root密码
su sky
(注意,因为可以有多个mysql,连接数据库时,需要制定socket,可以使用ps -ef|grep mysql 找到对应配置)
mysql -uroot -p --socket=/tmp/mysql.sock --port=3316
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
flush privileges;
(7)新增用户并且授权
su sky
mysql -uroot -proot
CREATE USER 'user'@'%' IDENTIFIED BY 'passowrd';
flush privileges;
GRANT ALL privileges ON *.* TO 'user'@'%';
flush privileges;
4. 配置主从集群
主从复制原理:主库被修改修改自己的二进制日志,然后将日志发送到从库,从库根据日志写入数据库(全同步复制:主库会等待所有的从库写入数据库,才会结束事务;半同步复制:只要有一个从库入库,整个事务就会结束;异步复制:主库不关心从库是否写入库)
注意:主从数据库的数据一定要保证统一,如果数据不统一,在对不统一的数据进行操作时,会出现同步失败的情况;之后将不会在同步!!
(1) 服务分配
master 192.168.0.90,slave 192.168.0.91
(2) 增加配置文件
在查阅的博客中,配置添加到了mysqld.cnf中,实际操作是添加到了my.cnf中;查阅资料,两者区别不大,都可做配置文件使用。
master增加配置:
//本台服务器的ip地址
bind-address = 192.168.0.90
//每台的节点id必须唯一
server-id = 1
//开启二进制日志(此日志保存的是mysql所有的操作)
log_bin = /usr/local/mysql/mysql-bin.log
slave增加配置:
//本台服务器的ip地址
bind-address = 192.168.0.91
//每台的节点id必须唯一
server-id = 2
//开启二进制日志(此日志保存的是mysql所有的操作)
log_bin = /usr/local/mysql/mysql-bin.log
(3)重启mysql
因为启动方式是用的 mysqld_safe & 方式,和正常流程有所不同,采用 kill 进程号方式,停掉mysql。再使用 ./bin/mysqld_safe --defaults-file=/etc/my-test.cnf方式启动mysql
(4)master创建主从同步的用户
实质上就是slave用来连接master的用户。 使用root用户登录master数据库,创建用户,并指定只能是slave主机192.168.0.91才可登录
CREATE USER 'slave1'@'192.168.0.91' IDENTIFIED BY 'slave';
赋予REPLICATION SLAVE权限
GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'192.168.0.91';
(5)给master的数据库加读锁(目的是为了保证binlog不会再增加)
FLUSH TABLES WITH READ LOCK;
(6) 记录log的位置
SHOW MASTER STATUS;
(7) 将mater的数据库内容导出
(8) 更改slave数据库的配置文件,重启mysql;将master的数据库内容导入
(9) 将slave与master建立关联,从而到达同步的目的
登录slave的mysql
关闭主从复制
STOP SLAVE;
建立关联
CHANGE MASTER TO MASTER_HOST = '192.168.0.90',
MASTER_USER = 'slave1',
MASTER_PASSWORD = 'slave',
MASTER_PORT=3316,
MASTER_LOG_FILE = 'mysql-bin.000001',
MASTER_LOG_POS = 154;
启用主从复制
START SLAVE;
(10) 解除master的读锁
UNLOCK TABLES;
(11)附录
使用此命令可以查看从服务器当前状态,以及执行的日志位置
show slave status;