搭建mysql集群

370 阅读4分钟

背景

大部分搭建mysql集群着重于集群本身,很少谈到安装mysql,尤其是在测试环境,服务器可能已经存在mysql的情况下;所以今天留下这个笔记。

集群采用主从结构,实现读写分离,分担了读操作对库的压力;但是存在master单点问题,数据一致性(同步延迟问题)。

搭建mysql集群

  1. 首先要关闭防火墙
systemctl stop firewalld
  1. 清空防火墙策略,关闭selinux(selinux是linux的安全子系统,它主要的作用是最大限度减少系统可访问资源;对安全性要求不高,可以关掉
iptables -F && setenforce
  1. 开始安装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;