为什么要设置mysql集群?
为了减轻,mysql服务器的IO压力,设置多个其他mysql服务器帮他分担读写操作
1.mysql复制集群的类型
主从架构(从服务器只读,不可写)
- 一主一从,
一主多重
主主架构
2.复制原理
1)若主服务器上的数据集较大,则需要我们将主服务器数据库所有内容做备份,然后发送给从服务器,随后获取二进制日志的文件,及其坐标用于后续的数据同步
2)所谓同步,是主服务器上的二进制日志中的SQL语句,发送到从服务器上的中继日志文件中,然后把这些SQL语句重放实现同步
3.与主从复制相关的线程
从服务器上:IO线程:用来连接主服务器的,监控二进制日志的变化,并接受的
SQL线程:监控,读取,并且重放中继日志中的SQL语句,并把数据写入服务器数据库中;
主服务器上:DUMP线程:将slave请求的二进制日志发送过去
4.主从复制的过程:
1.主服务器数据发生修改,写入数据库中,并且记录二进制日志文件中
2.slave的IO线程复制发生变化的二进制日志,并且记录到自己的中继日志中
3.slave的SQL线程,将复制过来的中继日志做重放,保持和master上数据的一致;
5.主从复制注意内容:
1.保证每个服务器的server_id设置不同,(后面读写分离做测试方便)
2.主服务器上开启二进制日志文件
3.从服务器关闭二进制日志文件,开启中继日志文件,并且设置read_only=ON
4.主服务器设置参数sync_binlog=1(每发生一次数据变化,就将变化内容写入二进制日志中)
innodb_flush_log_at_trx_commit=1(没提交一个事务,就将事务日志保存到磁盘中)
5.记得记录二进制日志的文件名和坐标
6.在主服务器上授权一个可以用于主从复制的用户
6.主从复制实例
主服务器文件配置
innodb_file_per_table=ON //开启innodb的单独表空间 skip_name_resolve=ON //跳过主机名解析 log_bin=binlog server_id=123 sync_binlog=1 innodb_flush_log_at_trx_commit=1
从服务器文件配置
innodb_file_per_table=ON skip_name_resolve=ON relay_log=slavelog server_id=7 read_only=ON
主服务器做数据备份并发给从服务器
MariaDB [(none)]> show master status; //记录此时二进制日志文件及坐标 +---------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +---------------+----------+--------------+------------------+ | binlog.000015 | 617 | | | +---------------+----------+--------------+------------------+ 1 row in set (0.00 sec) MariaDB [(none)]> grant replication slave on *.* to 'vuser'@'%' identified by '111111'; //授权一个用于主从复制的用户 Query OK, 0 rows affected (0.02 sec) [[email protected] ~]# mysqldump --all-databases --lock-all-tables > gg.sql //复制当前数据库并发给从服务器 [[email protected] ~]# scp gg.sql [email protected]:/root
从服务器上操作
MariaDB [zz]> \. /root/gg.sql //使用发送过来的数据库文件,初始化数据库 建立主从连接: MariaDB [zz]> change master to master_host='172.16.0.156',master_user='vuser',master_password='111111',master_port=3306,master_log_file='binlog.000015',master_log_pos=617; MariaDB [zz]> start slave; 开启从服务器 MariaDB [zz]> show slave status\G; 查看主从状态 *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event //若显示此行则配置成功 Master_Host: 172.16.0.156 Master_User: vuser Master_Port: 3306 Connect_Retry: 60 Master_Log_File: binlog.000015 Read_Master_Log_Pos: 831 Relay_Log_File: slavelog.000002 Relay_Log_Pos: 740 Relay_Master_Log_File: binlog.000015 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 831 Relay_Log_Space: 1027 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 123 1 row in set (0.00 sec)
若想关闭主从配置,需要在从服务器使用命令stop slave即可
二.双主复制
两个服务器,同时开启二进制日志文件和中继日志文件;并相互做change master to操作即可
三.读写分离(前提:主从复制)
mysqlrouter
原理
通过调用俩个不同的接口,将mysql语句分别调用
安装:mysqlrouter,配置配置文件/etc/mysqlrouter/mysqlrouter.conf
[routing:master] 添加俩个配置段//master 接口 bind_address = 172.16.0.155:40001 //绑定的ip地址和端口号 destinations = 172.16.0.156:3306 //后端的mysql服务 mode = read-write //模式(是否允许写) connect_time = 3 //连接时间 [routing:slave] bind_address = 172.16.0.155:40002 destinations = 172.16.0.155:3306 mode = read-only connect_time = 1
配置完成可以启动服务
[[email protected] ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 50 *:3306 *:*
LISTEN 0 128 *:111 *:*
LISTEN 0 5 192.168.122.1:53 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 128 127.0.0.1:631 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 172.16.0.155:40001 *:*
LISTEN 0 128 172.16.0.155:40002
mysqlrouter 测试实例:(因为mysqlrouter是调度到后端的,所以需要我们在master授权用户)
MariaDB [(none)]> grant all on *.* to 'cccc'@'172.16.0.%' identified by '111111'; Query OK, 0 rows affected (0.01 sec) [[email protected] ~]# mysql -ucccc -h172.16.0.151 -P40002 -p111111 -e 'select @@server_id;' +-------------+ | @@server_id | +-------------+ | 7 | +-------------+ [[email protected] ~]# mysql -ucccc -h172.16.0.151 -P40001 -p111111 -e 'select @@server_id;' +-------------+ | @@server_id | +-------------+ | 123 | +-------------+
四:proxysql实现读写分离
1.安装proxysql
2.启动ProxySQL服务
3.进入proxysql的管理界面
[[email protected] ~]# mysql -uadmin -padmin -h127.0.0.1 -P6032 //系统自己设定的用户密码,及端口号 使用main数据库 给mysql_servers表添加监控点: insert into mysql_servers(hostgroup_id,username,port) values(10,'172.16.0.156',3306),(10,'172.16.0.150',3306),(10,'172.16.0.151',3306),(10,'172.16.0.152',3306); 在master服务器上创建监控用户 MariaDB [(none)]> grant replication client,replication slave on *.* to 'proxyuser'@'172.16.0.%' identified by '111111'; 在proxysql上修改变量参数,设置相应的监控用户 MySQL [main]> set mysql-monitor_username='proxyuser'; //实质上是修改了main数据中的global_variables表 MySQL [main]> set mysql-monitor_password='111111'; 在proxysql服务器上修改mysql_replication_hostgroups,为表添加更明细的分组 MySQL [main]> insert into mysql_replication_hostgroups (writer_hostgroup,reader_hostgroup) values (10,20); 这里必须有一个ID和之前mysql_servers表中设置的相同,至于主从,会到后端服务器配置文件中读取read_only参数 在master服务器设置管理用户 MariaDB [(none)]> grant all on *.* to 'root'@'172.16.0.%' identified by '111111'; MariaDB [(none)]> grant all on *.* to 'sql'@'172.16.0.%' identified by '111111'; 在proxysql也添加各个管理用户 MySQL [main]> insert into mysql_users (username,password,default_hostgroup) values ('root','111111',10),('sql','111111',20); 这样当使用root用户访问时,会访问主服务器,使用sql时,会访问从服务器 在proxysql上同步刚刚配置的信息,同步到运行时环境,并且同步到磁盘上 load mysql servers to runtime save mysql servers to disk load mysql variables to runtime save mysql variables to disk load mysql users to runtime save mysql users to disk 最后使用调度端口访问mysql [[email protected] ~]# mysql -uroot -h172.16.0.154 -p111111 -P6033 -e "select @@server_id;" +-------------+ | @@server_id | +-------------+ | 123 | +-------------+ [[email protected] ~]# mysql -usql -h172.16.0.154 -p111111 -P6033 -e "select @@server_id;" +-------------+ | @@server_id | +-------------+ | 2 | +-------------+ [[email protected] ~]# mysql -usql -h172.16.0.154 -p111111 -P6033 -e "select @@server_id;" +-------------+ | @@server_id | +-------------+ | 3 | +-------------+ [[email protected] ~]# mysql -usql -h172.16.0.154 -p111111 -P6033 -e "select @@server_id;" +-------------+ | @@server_id | +-------------+ | 6 | +-------------+
注意:若主从连接不成功,尝试更改防火墙策略或用户授权
原文地址:http://blog.51cto.com/wangchaode/2156533