网站建设可行性报告,怎么进入自己网站主机地址,wordpress 后台菜单 层级,河北省住房与城乡建设厅网站文章目录一、为什么要使用主从复制和读写分离二、主从复制的原理三、如何实现主从复制3.1 master配置3.2 slave配置3.3 测试主从复制四、读写分离五、缺点一、为什么要使用主从复制和读写分离
注意到主从复制和读写分离一般是一起使用的。目的很简单#xff0c;就是提高数据库…
文章目录一、为什么要使用主从复制和读写分离二、主从复制的原理三、如何实现主从复制3.1 master配置3.2 slave配置3.3 测试主从复制四、读写分离五、缺点一、为什么要使用主从复制和读写分离
注意到主从复制和读写分离一般是一起使用的。目的很简单就是提高数据库的并发性能。比如说假设是单机读和写都在一台mysql上面完成性能肯定不高如果有三台mysql一台master只负责写操作两台slave负责读操作性能不就可以大大提高了吗。
所以主从复制和读写分离就是为了数据库能支持更大的并发。
随着业务量的扩展如果是单机部署的mysql会导致IO频率过高。采用主从复制和读写分离可以提高数据库的可用性。
二、主从复制的原理
当master节点进行insert, update, delete操作的时候会按照顺序写入binlog中。slave连接master主库master有多少个slave就会创建多少个binlog dump线程。当master节点的binlog发生变化的时候binlog dump线程会通知所有的slave节点并将相应的binlog内容推送给各个slave节点。IO线程接受到binlog内容后将内容写入到本地的relay-log(中继日志)。SQL线程读取IO线程写入的relay-log,并且根据relay-log的内容对slave数据库做相应的操作 请注意master节点和所有的slave节点都有的自己的bin-log。binlog是一个会记录数据库所有操作的二进制数据库从库从relay-log执行的所有操作都会写入到自己的binlog中。
三、如何实现主从复制
假设我们有三台虚拟机。IP分别是104(master)106(slave),107(slave). 预期的架构是一主二从如下图所示
3.1 master配置
//使用命令行进入mysql
mysql -u root -p
//192.168.0.106是slave从机的IP
GRANT REPLICATION SLAVE ON *.* to root192.168.0.106 identified by Java1234;
//192.168.0.107是slave从机的IP
GRANT REPLICATION SLAVE ON *.* to root192.168.0.107 identified by Java1234;
//刷新系统权限表的配置
FLUSH PRIVILEGES;//创建的这两个用户在配置slave从机时要用到
//接下来找到mysql的配置文件/etc/my.cnf增加以下配置
# 开启binlog
log-binmysql-bin
server-id104
# 需要同步的数据库如果不配置则同步全部数据库
binlog-do-dbtest_db
# binlog日志保留的天数清除超过10天的日志
# 防止日志文件过大导致磁盘空间不足
expire-logs-days10 //配置完成后重启mysql
service mysql restart//在mysql中可以通过show master status\G;查看当前binlog日志的信息后面有用3.2 slave配置
slave的配置相对会简单一些首先找到/etc/my.conf配置文件增加以下配置
# 不要和其他mysql服务id重复即可
server-id106
#接着使用命令行登录到mysql服务器:
mysql -u root -p
#进入到mysql中输入以下命令
CHANGE MASTER TO
MASTER_HOST192.168.0.104,//主机IP
MASTER_USERroot,//之前创建的用户账号
MASTER_PASSWORDJava1234,//之前创建的用户密码
MASTER_LOG_FILEmysql-bin.000001,//master主机的binlog日志名称
MASTER_LOG_POS862,//binlog日志偏移量
master_port3306;//端口#设置完之后启动slave服务
start slave;#启动完之后校验一下是否启动成功:
show slave status\G;#可以看到以下信息
**************** 1. row ***************************Slave_IO_State: Waiting for master to send event**Master_Host: 192.168.0.104**Master_User: rootMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000001Read_Master_Log_Pos: 619Relay_Log_File: mysqld-relay-bin.000001Relay_Log_Pos: 782Relay_Master_Log_File: mysql-bin.000001 //binlog日志文件名称Slave_IO_Running: Yes //Slave_IO线程、SQL线程都在运行Slave_SQL_Running: YesMaster_Server_Id: 104 //master主机的服务idMaster_UUID: 0ab6b3a6-e21d-11ea-aaa3-080027f8d623Master_Info_File: /var/lib/mysql/master.infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update itMaster_Retry_Count: 86400Auto_Position: 0另外一个slave的配置也一样在这里不再赘述。
3.3 测试主从复制
在master主机执行sql:
CREATE TABLE tb_commodity_info (id varchar(32) NOT NULL,commodity_name varchar(512) DEFAULT NULL COMMENT 商品名称,commodity_price varchar(36) DEFAULT 0 COMMENT 商品价格,number int(10) DEFAULT 0 COMMENT 商品数量,description varchar(2048) DEFAULT COMMENT 商品描述,PRIMARY KEY (id)
) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT商品信息表;接着我们可以看到两台slave也同步创建了商品信息表:
四、读写分离
在实现完主从复制之后我们还需要实现读写分离master负责写入数据两个slave负责读取数据。实现的方式有很多比如采用Spring AOP的方式去判断输入的mysql语句如果sql语句中包含get,select,query就去连接slave否则就去连接master。
但是通过AOP的方式实现起来代码有点繁琐有没有什么现成的框架呢答案是有的。Apache ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈它由 JDBC、Proxy两部分组成。读写分离就可以使用ShardingSphere-JDBC实现。
项目配置 版本说明
SpringBoot2.0.1.RELEASE
druid1.1.22
mybatis-spring-boot-starter:1.3.2
mybatis-plus-boot-starter3.0.7
sharding-jdbc-spring-boot-starter:4.1.1添加sharding-jdbc的maven配置
dependencygroupIdorg.apache.shardingsphere/groupIdartifactIdsharding-jdbc-spring-boot-starter/artifactIdversion4.1.1/version
/dependency然后在application.yml添加配置
# 这是使用druid连接池的配置其他的连接池配置可能有所不同
spring:shardingsphere:datasource:names: master,slave0,slave1master:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://192.168.0.108:3306/test_db?useUnicodetruecharacterEncodingutf8tinyInt1isBitfalseuseSSLfalseserverTimezoneGMTusername: yehongzhipassword: YHZ1234slave0:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://192.168.0.109:3306/test_db?useUnicodetruecharacterEncodingutf8tinyInt1isBitfalseuseSSLfalseserverTimezoneGMTusername: yehongzhipassword: YHZ1234slave1:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://192.168.0.110:3306/test_db?useUnicodetruecharacterEncodingutf8tinyInt1isBitfalseuseSSLfalseserverTimezoneGMTusername: yehongzhipassword: YHZ1234props:sql.show: truemasterslave:load-balance-algorithm-type: round_robinsharding:master-slave-rules:master:master-data-source-name: masterslave-data-source-names: slave0,slave1sharding.master-slave-rules是标明主库和从库一定不要写错否则写入数据到从库就会导致无法同步。
load-balance-algorithm-type是路由策略round_robin表示轮询策略。
启动项目可以看到以下信息代表配置成功 五、缺点
尽管主从复制、读写分离能很大程度保证MySQL服务的高可用和提高整体性能但是问题也不少
比如从机是通过binlog日志从master同步数据的如果在网络延迟的情况从机就会出现数据延迟。那么就有可能出现master写入数据后slave读取数据不一定能马上读出来。