mysql集群的搭建

       数据库是用来存储数据的,那么数据的重要性不言而喻,那么只用一台数据库存储数据是非常危险的,比如,如果这台数据库或者部署这台数据库的服务器崩溃了,那么这段时间的系统崩溃可能会造成不良的用户体验,进而导致经济效益的下滑。

       于是,我们就这样设想,如果有多台数据库提供服务支持,即使有一台崩溃了,还有其他的数据库顶上去干活那不就完事了,确实,这些若干个数据库共同组成了一个集群,称为数据库集群。它包括两种常见结构:一主多从,多主多从;如下:

 mysql集群的搭建_第1张图片

       主从复制的原理也非常简单,通俗的讲就是:当对主服务器进行写的操作时,主服务器将自己的操作记录到一个二进制日志文件中,从服务器有一个心跳机制,定时的去读取主服务器的日志文件,当对比自己的日志文件有差异时,将差异部分同步更新到自己的服务器上。

       好,有了这个概念了,然后正式开始搭建,首先搭建之前在linux系统上需要有个能用的mysql,比方说我的mysql路径是这个:

      这里我只有一台本地服务器,那我就在这一台服务器上创建多个数据库实例,等同于实际生产环境中的多台服务器,其中一台服务器一个数据库。先看看mysql的目录结构:

mysql集群的搭建_第2张图片

我们在其中的data目录下使用命令mkdir创建3307,3308,3309,3310四个数据库实例作为测试用:

mysql集群的搭建_第3张图片

 然后进入bin目录下,初始化这四个数据库实例:

使用命令:

 ./mysqld --initialize-insecure --basedir=/usr/local/mysql-5.7.18 --datadir=/usr/local/mysql-5.7.18/data/3307 --user=mysql

 ./mysqld --initialize-insecure --basedir=/usr/local/mysql-5.7.18 --datadir=/usr/local/mysql-5.7.18/data/3308 --user=mysql

 ./mysqld --initialize-insecure --basedir=/usr/local/mysql-5.7.18 --datadir=/usr/local/mysql-5.7.18/data/3309 --user=mysql

 ./mysqld --initialize-insecure --basedir=/usr/local/mysql-5.7.18 --datadir=/usr/local/mysql-5.7.18/data/3310 --user=mysql

(其中 initialize-insecure 表示不生成MySQL数据库root用户的随机密码,即root密码为空;)

结果,data目录中的3307,3308,3309和3310中就出现了数据库初始化文件,如下:

mysql集群的搭建_第4张图片

然后我们在/data/3307,/data/3308,/data/3309,/data/3310目录下使用命令touch各创建一个my.cnf配置文件,并在配置文件中配置如下信息:

[client]
port        = 3307
socket      = /usr/local/mysql-5.7.18/data/3307/mysql.sock
default-character-set=utf8

[mysqld]
port    = 3307
socket  = /usr/local/mysql-5.7.18/data/3307/mysql.sock
datadir = /usr/local/mysql-5.7.18/data/3307
log-error = /usr/local/mysql-5.7.18/data/3307/error.log
pid-file = /usr/local/mysql-5.7.18/data/3307/mysql.pid

character-set-server=utf8
lower_case_table_names=1
autocommit = 1

这是端口号为3307的配置文件,端口号为3308,3308和3310的配置文件只需将文件中的3307替换为相应的端口号即可。

然后进入bin目录下,使用mysql_safe命令指定配置文件并启动mysql服务,如下命令:

./mysqld_safe --defaults-file=/usr/local/mysql-5.7.18/data/3307/my.cnf &

./mysqld_safe --defaults-file=/usr/local/mysql-5.7.18/data/3308/my.cnf &

./mysqld_safe --defaults-file=/usr/local/mysql-5.7.18/data/3309/my.cnf &

./mysqld_safe --defaults-file=/usr/local/mysql-5.7.18/data/3310/my.cnf &

在bin目录下登录mysql,使用命令 ./mysql -uroot -p -P3307 -h127.0.0.1

mysql集群的搭建_第5张图片

 然后使用命令 alter user 'root'@'localhost' identified by '123456';  修改密码为123456,并使用

grant all privileges on *.* to root@'%' identified by '123456';  命令授予远程访问,其中root指的是用户名;

并使用命令 flush privileges;  刷新权限;

此时记得关闭防火墙:查看防火墙命令systemctl status firewalld ,关闭防火墙命令systemctl stop firewalld

mysql集群的搭建_第6张图片

 然后使用客户端工具连接数据库,如下:

mysql集群的搭建_第7张图片

如上操作在3308,3309和3310实例上同样操作一次。此时,我们四个数据库已准备好了。

mysql集群的搭建_第8张图片

当然,如果想要关闭这四个数据库实例的话,在bin目录下使用命令 ./mysqladmin -uroot -p -P3307 -h127.0.0.1 shutdown 进行关闭。 (注意:这是关闭端口号为3307的数据库实例)

到这里,数据库实例已准备好,接下来就是设置这四个数据库的关系,即为一主多从或者多主多从。

一主多从

在四个实例中的/data/3307等的my.cnf配置文件中添加如下配置信息:

主(3307)里面加入
log-bin=mysql-bin   #表示启用二进制日志
server-id=3307        #表示server编号,编号要唯一

从(3308)里面加入
server-id=3308        #表示server编号,编号要唯一

从(3309)里面加入
server-id=3309        #表示server编号,编号要唯一

从(3310)里面加入
server-id=3310        #表示server编号,编号要唯一

如下所示:

mysql集群的搭建_第9张图片

 在重新启动四个数据库实例,设定一个主服务器,在主服务器上使用命令 

grant replication slave on *.* to 'copy'@'%' identified by '123456';    创建复制的账号并授权。

并使用命令  reset master;  重置一下主服务器状态。

mysql集群的搭建_第10张图片

 此时,我们发现,在3307实例的数据库中的user表中多出了一个copy的用户:

mysql集群的搭建_第11张图片

 

 再使用命令  show master status;  获取主服务器二进制binlog文件名及坐标(二进制文件名和坐标值在后面会用到)。

mysql集群的搭建_第12张图片

File即为二进制文件名称,Position即为该文件坐标。

 然后在3308,3309和3310从服务器上使用

stop slave;
reset slave;

重置一下服务器。

然后在从服务器上使用命令:

change master to master_host='192.168.23.130',master_user='copy',
master_port=3307,master_password='123456',
master_log_file='mysql-bin.000001',master_log_pos=154;

设置主从关系(change master to master_host表示服务器ip,master_user表示服务器用户名,master_port表示端口号,master_password表示密码,master_log_file表示二进制日志文件名称,master_log_pos表示二进制日志文件地址)

然后在从服务器上使用  start slave;  命令开启主从关系。

我们使用命令  show slave status \G 查看从服务器功能状态;

mysql集群的搭建_第13张图片

可以看到主从服务器的关系。 

以上,一主多从的服务器关系设置完毕,去数据库查看更直观的关系,比方说,我们在主数据库3307中创建一张表,那么3308,3309和3310中会自动创建一张一模一样的表,如果在3307中对表中的数据进行插入,删除,修改操作,那么其他的从库也相应的会自动重现同样的操作。

以上即为一主多从数据库集群的搭建,下面介绍多主多从数据库集群的搭建。

 

多主多从

       对于一主多从服务器,当主服务器挂掉了,那么整个数据库集群系统就全部挂掉了,这显然不是我们希望看到的,那么自然的就想到了使用多个主服务器来提供服务,当其中一个主服务器挂掉了,其他的主服务器还能继续提供服务。这就是多主多从存在的意义。

       假如,我们使3307和3308为主,3309和3310为从,如下:

mysql集群的搭建_第14张图片

首先,需要在3308的my.cnf配置文件中添加一个 “log-bin=mysql-bin” 配置信息,就像3307的配置文件一样。

mysql集群的搭建_第15张图片

 然后,3307主服务器的my.cnf文件增加如下配置:

auto_increment_increment=2
auto_increment_offset=1
log-slave-updates
sync_binlog=1

3308主服务器增加如下配置:

auto_increment_increment=2
auto_increment_offset=2
log-slave-updates
sync_binlog=1

配置说明如下:

    auto_increment_increment,控制主键自增的自增步长,用于防止Master与Master之间复制出现重复自增字段值,通常auto_increment_increment=n,有多少台主服务器,n 就设置为多少;

    auto_increment_offset=1设置自增起始值,这里设置为1,这样Master的auto_increment字段产生的数值是:1, 3, 5, 7, …等奇数ID

   注意auto_increment_offset的设置,不同的master设置不应该一样,否则就容易引起主键冲突,比如master1的offset=1,则master2的offset=2,master3的offset=3

   在双主模式中,log-slave-updates 配置项一定要配置,否则在master1(3307)上进行了更新数据,在master2(3308)和slave1(3309)上会更新,但是在slave2(3310)上不会更新

   sync_binlog表示每几次事务提交,MySQL把binlog缓存刷进日志文件中,默认是0,最安全的是设置为1;

 由于3309和3310服务器之前指向的是3307日志文件和位置,所以先删除掉里面的localhost-relay-bin.000001和localhost-relay-bin.index文件:

mysql集群的搭建_第16张图片

然后使用如下命令在bin目录下启动四台服务:

./mysqld_safe --defaults-file=/usr/local/mysql-5.7.18/data/3307/my.cnf &

./mysqld_safe --defaults-file=/usr/local/mysql-5.7.18/data/3308/my.cnf &

./mysqld_safe --defaults-file=/usr/local/mysql-5.7.18/data/3309/my.cnf &

./mysqld_safe --defaults-file=/usr/local/mysql-5.7.18/data/3310/my.cnf &

然后,使用命令   ./mysql -uroot -p -P3307 -h127.0.0.1  和   ./mysql -uroot -p -P3308 -h127.0.0.1  进入3307和3308主机。

然后再以同样的方式启动3309和3310两个从服务器,并且在这四个服务器上使用如下命令重置服务:

stop slave;
reset slave;
reset master;

设置从服务器3308、3309,他们的主均为3307,即在3308和3309上执行如下操作:

change master to master_host='192.168.23.130',
master_user='copy',
master_password='123456',
master_port=3307, 
master_log_file='mysql-bin.000001',
master_log_pos=154;
设置从服务器3307、3310,他们的主均为3308,即在3307和3310上执行如下操作:

change master to master_host='192.168.23.130',
master_user='copy',
master_password='123456',
master_port=3308, 
master_log_file='mysql-bin.000001',
master_log_pos=154;	

然后在这四台服务器上mysql命令行执行  start slave;

然后我们使用命令 show slave status \G 命令查看各从数据库的主从关系;比方说我们看看3307的:

mysql集群的搭建_第17张图片

 这样,就配置好了,在连接数据库,不仅是3307,在3308中建表,插入删除修改数据,其他的库都相应的会同样的改变。

以上即为数据库集群的配置。。。

 

你可能感兴趣的:(mySQL笔记)