赞
踩
- [mysqld]
- server-id=47
- #开启binlog
- log_bin=master-bin
- log_bin-index=master-bin.index
- skip-name-resolve
- # 设置连接端口
- port=3306
- # 设置mysql的安装目录
- basedir=/usr/local/mysql
- # 设置mysql数据库的数据的存放目录
- datadir=/usr/local/mysql/mysql-files
- # 允许最大连接数
- max_connections=200
- # 允许连接失败的次数。
- max_connect_errors=10
- # 服务端使用的字符集默认为UTF8
- character-set-server=utf8
- # 创建新表时将使用的默认存储引擎
- default-storage-engine=INNODB
- # 默认使用“mysql_native_password”插件认证
- #mysql_native_password
- default_authentication_plugin=mysql_native_password

- 配置说明:主要需要修改的是以下几个属性:
- server-id:服务节点的唯一标识。需要给集群中的每个服务分配一个单独的ID。
- log_bin:打开Binlog日志记录,并指定文件名。
- log_bin-index:Binlog日志文件
- #登录主数据库
- mysql -u root -p
- GRANT REPLICATION SLAVE ON *.* TO 'root'@'%';
- flush privileges;
- #查看主节点同步状态:
- show master status;
- [mysqld]
- #主库和从库需要不一致
- server-id=48
- #打开MySQL中继日志
- relay-log-index=slave-relay-bin.index
- relay-log=slave-relay-bin
- #打开从服务二进制日志
- log-bin=mysql-bin
- #使得更新的数据写进二进制日志中
- log-slave-updates=1
- # 设置3306端口
- port=3306
- # 设置mysql的安装目录
- basedir=/usr/local/mysql
- # 设置mysql数据库的数据的存放目录
- datadir=/usr/local/mysql/mysql-files
- # 允许最大连接数
- max_connections=200
- # 允许连接失败的次数。
- max_connect_errors=10
- # 服务端使用的字符集默认为UTF8
- character-set-server=utf8
- # 创建新表时将使用的默认存储引擎
- default-storage-engine=INNODB
- # 默认使用“mysql_native_password”插件认证
- #mysql_native_password
- default_authentication_plugin=mysql_native_password

- #登录从服务
- mysql -u root -p;
- #设置同步主节点:
- CHANGE MASTER TO
- MASTER_HOST='192.168.232.128',
- MASTER_PORT=3306,
- MASTER_USER='root',
- MASTER_PASSWORD='root',
- MASTER_LOG_FILE='master-bin.000004',
- MASTER_LOG_POS=156,
- GET_MASTER_PUBLIC_KEY=1; #指示是否从源请求基于RSA密钥对的密码交换所需的公共密钥
- #开启slave
- start slave;
- #查看主从同步状态
- show slave status;
- 或者用 show slave status \G; 这样查看比较简洁

注: GET_MASTER_PUBLIC_KEY 参数在8.0之前无效
然后我们在主服务器上创建一个数据库
- mysql> create database syncdemo;
- Query OK, 1 row affected (0.00 sec)
接下来我们继续在syncdemo这个数据库中创建一个表,并插入一条数据。
- #需要同步的二进制数据库名
- binlog-do-db=masterdemo
- #只保留7天的二进制日志,以防磁盘被日志占满(可选)
- expire-logs-days = 7
- #不备份的数据库
- binlog-ignore-db=information_schema
- binlog-ignore-db=performation_schema
- binlog-ignore-db=sys
- #如果salve库名称与master库名相同,使用本配置
- replicate-do-db = masterdemo
- #如果master库名[mastdemo]与salve库名[mastdemo01]不同,使用以下配置[需要做映射]
- replicate-rewrite-db = masterdemo -> masterdemo01
- #如果不是要全部同步[默认全部同步],则指定需要同步的表
- replicate-wild-do-table=masterdemo01.t_dict
- replicate-wild-do-table=masterdemo01.t_num
- gtid_mode=on
- enforce_gtid_consistency=on
- log_bin=on
- server_id=单独设置一个
- binlog_format=row
- gtid_mode=on
- enforce_gtid_consistency=on
- log_slave_updates=1
- server_id=单独设置一个
- mysqldump -u root -p --all-databases > backup.sql
- #输入密码
- mysql -u root -p < backup.sql
- #输入密码
首先我们登陆主服务,安装semisync_master模块:
- mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
- Query OK, 0 rows affected (0.01 sec)
- mysql> show global variables like 'rpl_semi%';
- +-------------------------------------------+------------+
- | Variable_name | Value |
- +-------------------------------------------+------------+
- | rpl_semi_sync_master_enabled | OFF |
- | rpl_semi_sync_master_timeout | 10000 |
- | rpl_semi_sync_master_trace_level | 32 |
- | rpl_semi_sync_master_wait_for_slave_count | 1 |
- | rpl_semi_sync_master_wait_no_slave | ON |
- | rpl_semi_sync_master_wait_point | AFTER_SYNC |
- +-------------------------------------------+------------+
- 6 rows in set, 1 warning (0.02 sec)
- mysql> set global rpl_semi_sync_master_enabled=ON;
- Query OK, 0 rows affected (0.00 sec)

- mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
- Query OK, 0 rows affected (0.01 sec)
- mysql> show global variables like 'rpl_semi%';
- +---------------------------------+-------+
- | Variable_name | Value |
- +---------------------------------+-------+
- | rpl_semi_sync_slave_enabled | OFF |
- | rpl_semi_sync_slave_trace_level | 32 |
- +---------------------------------+-------+
- 2 rows in set, 1 warning (0.01 sec)
- mysql> set global rpl_semi_sync_slave_enabled = on;
- Query OK, 0 rows affected (0.00 sec)
- mysql> show global variables like 'rpl_semi%';
- +---------------------------------+-------+
- | Variable_name | Value |
- +---------------------------------+-------+
- | rpl_semi_sync_slave_enabled | ON |
- | rpl_semi_sync_slave_trace_level | 32 |
- +---------------------------------+-------+
- 2 rows in set, 1 warning (0.00 sec)
- mysql> stop slave;
- Query OK, 0 rows affected (0.01 sec)
- mysql> start slave;
- Query OK, 0 rows affected (0.01 sec)

- 到这里可以看到,在MySQL主从架构中,是需要严格限制从服务的数据写入的,一旦从服务有数据写入,就会造成数据不一致。并且从服务在执行事务期间还很容易造成数据同步失败。
- 如果需要限制用户写数据,我们可以在从服务中将read_only参数的值设为1( set global read_only=1; )。这样就可以限制用户写入数据。但是这个属性有两个需要注意的地方:
-
- 1、read_only=1设置的只读模式,不会影响slave同步复制的功能。 所以在MySQL slave库中设定了read_only=1后,通过 "show slavestatus\G" 命令查看salve状态,可以看到salve仍然会读取master上的日志,并且在slave库中应用日志,保证主从数据库同步一致;
- 2、read_only=1设置的只读模式, 限定的是普通用户进行数据修改的操作,但不会限定具有super权限的用户的数据修改操作。 在MySQL中设置read_only=1后,普通的应用用户进行insert、update、delete等会
- 产生数据变化的DML操作时,都会报出数据库处于只读模式不能发生数据变化的错误,但具有super权限的用户,例如在本地或远程通过root用户登录到数据库,还是可以进行数据变化的DML操作; 如果需要限定
- super权限的用户写数据,可以设置super_read_only=0。另外 如果要想连super权限用户的写操作也禁止,就使用"flush tables with readlock;",这样设置也会阻止主从同步复制!
-
- 这一部分方案只需要了解即可,因为一方面,这些高可用方案通常都是运维需要考虑的事情,作为开发人员没有必要花费太多的时间精力,偶尔需要用到的时候能够用起来就够了。另一方面,随着业界技术的不断
- 推进,也会冒出更多的新方案。例如ShardingSphere的5.x版本的目标实际上就是将ShardingSphere由一个数据库中间件升级成一个独立的数据库平台,而将MySQL、PostGreSql甚至是RocksDB这些组件作为数据库的后端支撑。等到新版本成熟时,又会冒出更多新的高可用方案。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。