• mysql主从复制和读写分离


    主从复制

    主mysql上的数据,新增,修改库,表,表里的数据,都会同步到从mysql上

    mysql的主从复制的模式

    1、异步复制,mysql的默认复制就是异步复制,只要执行完之后,客户端提交事务,主mysql会立刻把结果,返回给从服务器,主mysql并不关心从mysql是否已经接受,并且处理

    主一旦崩溃,主mysql的事务可能没有传到mysql,这个时候强行把从提升为主,可能到新的主mysql,数据不完整(很少见,工作当中异步复制)

    2、全同步复制,主库执行完成一个事务,所有的从库都执行了该事务之后才会返回客户端

    因为需要等待所有库全部执行完成,性能必然下降(对数据一致性,和数据完整要求很好的场景)

    3、半同步复制:介于异步复制和全同步复制之间,主库执行完一个客户端提交的事务之后,至少等待一个从库接受并处理完成之后,才会返回客户端,半同步在一定程度上提高了数据的安全性,也会有一定的延迟

    这个延迟一般是一个tcp/ip的往返时间(从发送到接受的时间,单位是毫秒),半同步复制最好在电视的网络中使用

    时间<1ms: round-triptime RTT

    主从复制的工作过程

    1、主节点的数据记录发生变化会记录在二进制日志

    2、slave节点一定时间内对主库的二进制日志文件进行探测,看其是否发生变化,如果有变化,从库会开启一个I/o的线程请求的主库的二进制事件

    3、主库会给每一个I/O的线程启动一个dump,用于发送二进制时间给从从库,从库通过I/O线程获取更行,slave_sql负责将更新写入到从库本地,实现主从一致

    主从复制问题

    1、只能在主库上发生变化,然后同步到从

    2、复制过程是串行化过程,在从库上复制是串行的,主库的并行更新不能在库上并行操作

    3、主从复制的设计目的,就是为了主库上写,在从库上查,读写分离,实现高可用

    读写分离

    要实现读写分离,必须要先实现主从复制

    读写分离

    所有的写入操作都在主库,从库只负责读(select),如果有更新,是从主库复制到从库

    为什么要有读写分离

    1、数据库在写入数据时,比较耗时(mysql写一万条数据用时3分30秒)

    2、数据库在读的时候,速度很快(读10000条,4.96s)

    读写分离之后,数据库的写入和读取是分开的,哪怕写入的数据量比较大,但是不影响查询的效率

    在什么场景下需要读写分离

    数据库不是一定需要读写分离的,只有在某些程序在使用数据库过程中,更新少,但是查询较多,这种情况下可以考虑读写分离

    读和查的需求差不多,也可以考虑读写分离

    生产一般都会做读写分离

    测试库一般不管

    在工作中,数据库的读写不会在同一个库中完成,既不安全,也不能满足高可用,也不能实现高并发,工作中都会做读写分离

    mysql读写分离的原理

    1、根据脚本实现,在代码中实现路由分类,select insert进行路由分类,这种方式最多的

    性能好, 在代码中就可以实现,不需要额外的硬件设备

    缺点:开发实现的,跟我们无关,如果大型的复杂的应用,设计改动的代码非常多

    2、基于中间代理层实现

    mysql-proxy自带的开源项目,基于自带的lua脚本,这些lua脚本不是现成的,要自己写,不熟悉他的内置变量写不出来的

    atlas 360 内部做自己使用的代理工具,每天的读写请求承载量可以到几十亿条,支持事务,支持存储过程

    amoeba 是由java开发的一个开源团建,不支持事务,也不支持存储过程,但是amoeba还是用的最多的功能比较强大的软件

    如何实现主从复制

    架构主从复制和读写分离

    mysql1 主 20.0.0.50

    mysql2 从 20.0.0.51

    mysql3 从 20.0.0.52

    test1 读写分离的服务器 20.0.0.10

    test2 客户端 20.0.0.20

    1. 关闭防火墙和安全机制
    2. mysql服务器
    3. 1、主从服务器的时间也要同步
    4. 安装同步时间工具
    5. yum -y install ntp ntpdate
    6. mysql1
    7. vim /etc/ntp.conf
    8. server 127.127.233.0
    9. fudge 127.127.233.0 stratum 8
    10. #数字越小,时间精确度越高,设置fudge 8 时间层级是8 最高到15,从本地获取时间源同步,不走网络获取
    11. 重启服务
    12. service ntpd start
    13. /usr/sbin/ntpdate 20.0.0.50
    14. crontab -e
    15. */30 * * * * /usr/sbin/ntpdate 20.0.0.50
    16. 2、改mysql主配置文件
    17. vim /etc/my.cnf
    18. log-bin=master-bin
    19. binlog_format=MIXED
    20. log-slave-updates=true
    21. #允许从服务器,复制数据时,可以从主的二进制日志写到自己的二进制日志当中
    22. 重启mysql服务
    23. 进入mysql
    24. grant replication slave on * . * to 'myslave'@'20.0.0.% ' identified by '123456'
    25. 刷新权限
    26. flush privileges
    27. 查看位置点
    28. show master status
    29. 从 mysql2
    30. vim /etc/my.cnf
    31. server-id = 2
    32. relay-log=relay-log-bin
    33. 自定义中继名称
    34. relay-log-index=slave-relay-bin.index
    35. relay_log_recovery=1
    36. 默认是0,1开启中继日志的服务,从服务器出现异常或者崩溃时,从服务器会从主服务器的二进制的争取读取和应用中继日志,同步
    37. 重启mysql服务
    38. 从 mysql3
    39. server-id = 3
    40. relay-log=relay-log-bin
    41. 自定义中继名称
    42. relay-log-index=slave-relay-bin.index
    43. relay_log_recovery=1
    44. 重启mysql服务
    45. mysql2和mysql3进入数据库
    46. mysql -u root -p123456
    47. 同步
    48. CHANGE master to master_host='20.0.0.50',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=604;
    49. 开启slave
    50. start slave;
    51. 查看slave
    52. show slave status;
    53. Slave-IO_Running:Yes
    54. 负责和主库的IO的通信
    55. Slave_SQL_Running:Yes
    56. 负责自己的slave mysql进程

    Amoeba实现读写分离

    1. Amoeba服务器配置
    2. cd /opt/
    3. cp jdk-6u14-linux-x64.bin /usr/local/
    4. cd /usr/local/
    5. chmod +x jdk-6u14-linux-x64.bin
    6. ./jdk-6u14-linux-x64.bin
    7. //按yes,按enter
    8. mv jdk1.6.0_14/ /usr/local/jdk1.6
    9. vim /etc/profile
    10. export JAVA_HOME=/usr/local/jdk1.6
    11. export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
    12. export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin
    13. export AMOEBA_HOME=/usr/local/amoeba
    14. export PATH=$PATH:$AMOEBA_HOME/bin
    15. source /etc/profile
    16. java -version
    17. ##安装 Amoeba软件##
    18. mkdir /usr/local/amoeba
    19. tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
    20. chmod -R 755 /usr/local/amoeba/
    21. /usr/local/amoeba/bin/amoeba
    22. //如显示amoeba start|stop说明安装成功
    23. ##配置 Amoeba读写分离,两个 Slave 读负载均衡##
    24. #先在Master、Slave1、Slave2 的mysql上开放权限给 Amoeba 访问
    25. grant all on *.* to amoeba@'20.0.0.%' identified by '123456';
    26. flush privileges;
    27. #再回到amoeba服务器配置amoeba服务:
    28. cd /usr/local/amoeba/conf/
    29. cp amoeba.xml amoeba.xml.bak
    30. vim amoeba.xml #修改amoeba配置文件
    31. --30行--
    32. <property name="user">amoeba</property>
    33. --32行--
    34. <property name="password">123456</property>
    35. --115行--
    36. <property name="defaultPool">master</property>
    37. --117-去掉注释-
    38. <property name="writePool">master</property>
    39. <property name="readPool">slaves</property>
    40. cp dbServers.xml dbServers.xml.bak
    41. vim dbServers.xml #修改数据库配置文件
    42. --23行--注释掉 作用:默认进入test库 以防mysql中没有test库时,会报错
    43. <!-- <property name="schema">test</property> -->
    44. --26--修改
    45. <property name="user">amoeba</property>
    46. --28-30--去掉注释
    47. <property name="password">123456</property>
    48. --45--修改,设置主服务器的名Master
    49. <dbServer name="master" parent="abstractServer">
    50. --48--修改,设置主服务器的地址
    51. <property name="ipAddress">192.168.233.21</property>
    52. --52--修改,设置从服务器的名slave1
    53. <dbServer name="slave1" parent="abstractServer">
    54. --55--修改,设置从服务器1的地址
    55. <property name="ipAddress">192.168.233.22</property>
    56. --58--复制上面6行粘贴,设置从服务器2的名slave2和地址
    57. <dbServer name="slave2" parent="abstractServer">
    58. <property name="ipAddress">192.168.233.23</property>
    59. --65行--修改
    60. <dbServer name="slaves" virtual="true">
    61. --71行--修改
    62. <property name="poolNames">slave1,slave2</property>
    63. /usr/local/amoeba/bin/amoeba start & #启动Amoeba软件,按ctrl+c 返回
    64. netstat -anpt | grep java #查看8066端口是否开启,默认端口为TCP 8066
    65. ----测试读写分离 ----
    66. yum install -y mariadb-server mariadb
    67. systemctl start mariadb.service
    68. #在主从服务器上开启查询日志
    69. general_log=ON
    70. general_log_file=/usr/local/mysql/data/mysql_general.log
    71. 在客户端服务器上测试:
    72. mysql -u amoeba -p123456 -h 192.168.233.10 -P8066

  • 相关阅读:
    K8s-CRD实战
    JVM性能调优
    在本地Linux环境中安装lmmich并异地远程上传和管理照片
    记录那些学编程的网站
    记一次公司被勒索病毒攻击事迹,上上下下咬牙切齿
    【每日一题Day39】细分图中的可到达节点 | 图论
    AndroidStudio案例——跑马灯
    Linux 进程终止和等待
    Promise, async, await实现异步编程,代码详解
    Android基础第八天 | 字节跳动第四届青训营笔记
  • 原文地址:https://blog.csdn.net/qq_71147683/article/details/134374427