前言
在很多项目,特别是互联网项目,在使用MySQL时都会采用主从复制、读写分离的架构。
为什么要采用主从复制读写分离的架构?如何实现?有什么缺点?让我们带着这些问题开始这段学习之旅吧!
**
为什么使用主从复制、读写分离**
主从复制、读写分离一般是一起使用的。目的很简单,就是为了提高数据库的并发性能。你想,假设是单机,读写都在一台MySQL上面完成,性能肯定不高。如果有三台MySQL,一台mater只负责写操作,两台salve只负责读操作,性能不就能大大提高了吗?
所以主从复制、读写分离就是为了数据库能支持更大的并发。
随着业务量的扩展、如果是单机部署的MySQL,会导致I/O频率过高。采用主从复制、读写分离可以提高数据库的可用性。
主从复制的原理
①当Master节点进行insert、update、delete操作时,会按顺序写入到binlog中。
②salve从库连接master主库,Master有多少个slave就会创建多少个binlog dump线程。
③当Master节点的binlog发生变化时,binlog dump 线程会通知所有的salve节点,并将相应的binlog内容推送给slave节点。
④I/O线程接收到 binlog 内容后,将内容写入到本地的 relay-log。
⑤SQL线程读取I/O线程写入的relay-log,并且根据 relay-log 的内容对从数据库做对应的操作。
我这里用三台虚拟机(Linux)演示,IP分别是104(Master),106(Slave),107(Slave)。
预期的效果是一主二从,如下图所示:
mv /usr/share/mysql/my-medium.cnf /etc/my.cnf 替换默认配置文件 一般情况下 使用这个的较多 编辑 vim /etc.my.cnf 主库 master server-id = 100 主要就是用来区分master库和slaver库的 log-bin=mysql-bin 开启master的二进制文件 名字可以自定义 log-slave-update=true 这个手写 开启从库可以读取主库的二进制log 进行update操作 从库 slave server-id = 200 有几台slave就写几个 不要重复 relay-log=xxx-log-bin 从master同步过来 也要记一下二进制的 relay-log-index=relay-log-bin.index 可以自定义 文件量大 要做个索引 全局配置 做好以后 systemctl enable mariadb 开机自启 systemctl start mariadb 启动数据库 设置个密码 mysql -uroot password ‘xxxxx’ 做好这些后 要赋予salve权限 可以从master同步的权限 查看权限的命令 show privileges; 有了这个权限了 得有相应的用户 需要建立一个用户去做这件事情 slave机器就能通过这个用户的这个权限去做这件事了 grant Replication slave on *.* to slaver@'192.168.60.60' identified by 'qweqwe'; flush privileges;刷新 刷新下权限 在salve机器上 看下 show master status; MariaDB [(none)]> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000003 | 383 | | | +------------------+----------+--------------+------------------+ file 就是这个master的二进制文件 Position 二进制文件的编号 slave 就是从 这个二进制文件的这个编号开始同步 从库 change master to master_host='192.168.60.66',master_user='slaver@192.168.60.66',master_password='qweqwe',master_log_file='mysql-bin.000003',master_log_pos=616; start slave; 开启同步 在slave上做 show slave statusG; 查看状态 二进制文件 /var/lib/mysql/ 读写分离 amoba 要有有个中介器来进行连接数据库进行分配权限 就是amoba 首先 既然amoba要链接数据库 要先有一个账号 1 在所有数据库创建账号 grant all on *.* to 'amoba'@'192.168.60.%' identified by '123123'; 所有节点都做 2,编辑amebo的配置文件 vim /usr/local/amobe/conf/amoba.xmlroot 改下amebo的user 可以自定义密码 接下来要配置什么呢 既然要实现读写分离 肯定要定义数据库的读池和写池 怎么定义呢 一般client访问进来有个默认的池 可以自定义默认访问的 但要先定义读写池的名字 我这里 写池叫 master 读池叫slavs 所以我定义的默认进来访问的是写池 默认访问进来是进那个组master master slaves 到这里 大框架就定义完了 该定义细节了 就是到底谁是master 谁是slaves 在 /usr/local/amoba/amoeba/amoeba-mysql-3.0.5-RC/conf/dbServers.xml 注意 是dbServers.xml这个文件 进来后要定义 连接数据库使用的账号密码amoba 123123
完成后启动
/usr/local/amoba/amoeba/amoeba-mysql-3.0.5-RC/bin/launcher
创建完后进行 登录 登录这里不是登录数据库 而是登录amoeba服务器登录mysql mysql -u amoba -p -h 36.107.225.218 -P 8066 这里就是之前定义的amoba的账号密码 登录上测试主从 create database xxx; use xxx; create table tables(id int,name varchar(10),age int); 注意测试读写之前 要将主从先做好。



