文章目录
什么是云原生
什么是Docker
MySQL主从复制(1主1从)
Redis集群(3主6从)
Pivotal公司的Matt Stine于2013年首次提出云原生(Cloud-Native)的概念;2015年,云原生刚推广时,Matt Stine在《迁移到云原生架构》一书中定义了符合云原生架构的几个特征:12因素、微服务、自敏捷架构、基于API协作、扛脆弱性;到了2017年,Matt Stine在接受InfoQ采访时又改了口风,将云原生架构归纳为模块化、可观察、可部署、可测试、可替换、可处理6特质;而Pivotal最新官网对云原生概括为4个要点:DevOps+持续交付+微服务+容器。
总而言之,符合云原生架构的应用程序应该是:采用开源堆栈(K8S+Docker)进行容器化,基于微服务架构提高灵活性和可维护性,借助敏捷方法、DevOps支持持续迭代和运维自动化,利用云平台设施实现弹性伸缩、动态调度、优化资源利用率。
总而言之:
Docker是一个高性能的容器引擎;
可以把本地源代码、配置文件、依赖、环境通通打包成一个容器即可以到处运行;
使用Docker安装软件十分方便,而且安装的软件十分精简,方便扩展。
Master节点配置
在主数据库创建的该帐号密码只是用来进行同步数据。
[root@aubin ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES2c4136668536 mysql:5.7 "docker-entrypoint.s…" 3 minutes ago Up 9 seconds 33060/tcp, 0.0.0.0:3308->3306/tcp, :::3308->3306/tcp mysql-slave20fc7174d1a7 mysql:5.7 "docker-entrypoint.s…" 15 hours ago Up 8 minutes 33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp mysql-master
在Master节点中找到ens33的ip地址并放到下面的master_host中(记住这个ip是Master数据库的服务器ip,不是从数据库的):
记住下面这个命令要在从(slave)数据库执行:
change master to master_host='192.168.184.132',master_user='slave',master_password='123456',master_port=3307,master_log_file='order-mysql-bin.000001',master_log_pos=617,master_connect_retry=30;
我们找到里面的Slave_IO_Running: No,Slave_SQL_Running: No属性,发现都是No的状态,证明主从同步还没有开始。。。
我们可以看到已经都为yes了,说明主从同步已经开启。
测试主从同步
在Master数据库执行:
也可以用Navicat去连接这两个数据库。如果Navicat出现连接不了docker的mysql,则可以:
方法一:关闭防火墙(测试环境用,生产环境不可以用)
方法二:开放防火墙对应端口,比如master数据库的3307和slave数据库的3308(生产环境用这个)
主从同步失败问题(Slave_SQL_Running:No)
mysql> show slave status \G;*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.184.132 Master_User: slave Master_Port: 3307 Connect_Retry: 30 Master_Log_File: order-mysql-bin.000001 Read_Master_Log_Pos: 3752 Relay_Log_File: 2c4136668536-relay-bin.000002 Relay_Log_Pos: 326 Relay_Master_Log_File: order-mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: No Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 1007 Last_Error: Error 'Can't create database 'mall'; database exists' on query. Default database: 'mall'. Query: 'create database mall'
Slave_SQL_Running:No的解决办法
1:把主数据库和从数据库变成一模一样,也就是把多余的数据库和表删除掉,变成默认的mysql状态。(切记生产环境下要做好数据备份!!!)
2:结束同步:
3:再次开启同步:
4:搞定!
10亿条数据怎么进行缓存
过程
1:假设一共有5台Redis服务器,编号分别为:0 1 2 3 4,服务器台数为count=5
2:先把key(关键字)进行哈希后产生一个哈希值为val,假设这个val为22
3:再用哈希取余算法公式:val%count,也就是22%5=2
4:那么就定位到3号(0为1号机器),那么该数据就插入3号Redis机器中
缺点:
1:Redis节点扩容十分麻烦,如果此时从5台机器变成10台,那么我们需要去修改哈希取余算法的公式,不利于扩展。
2:又或者是缩容也十分麻烦,如果有一台服务器宕机了,在线机器从5->4台,那么也需要去修改哈希取余算法公式。
图解:
先虚拟一个哈希环,记录我们机器的ip的hash对应到哈希环中:
将对象的关键字key进行hash,顺时针寻找我们的机器,如果机器还在线就插入:
过程
1:虚拟一个哈希环(类似于大小为2^32的数组arr),即0 ~ (2^32)-1的空间中。
2:对我们所有的Redis节点所在的服务器IP或者主机名进行hash,得到的这个hash值记录下来。
3:先把key(关键字)进行hash后产生一个hash值为val
4:把这个val当成数组的下标进行遍历(也就是从这个位置顺时针遍历哈希环)一旦遇到Redis节点的hash值则进行插入,如果该节点宕机了则插入失败,这个时候我们就会跳过这个Redis节点继续顺时针搜索合适的节点,直到插入成功或者遍历完整个哈希环(当然此时是最坏情况)。
5:如果有新增的节点就按照第2步操作即可
6:如果Redis节点被删除或者宕机了,就移除这个记录的节点即可。
优点:
方便扩容和缩容,不需要和哈希取余算法一样更改算法公式,扩展性很好。
是因为哈希环的大小是2^32,几乎涵盖了所有hash值的可能。
缺点:
hash槽算法(大厂采用、和Redis集群也是采用这种)
1:由于一致性hash算法会导致数据倾斜问题,而hash槽可以避免这个问题。
2:Redis的hash槽大小固定为:16384个。
3:将hash槽均匀分配到各个Master节点上(注意:slave节点不会被分配)
4:假如有三个Redis节点,则会分配成5461:5462:5461
5:将关键字(key)进行hash取值,并且映射到对应的hash槽位上。
6:如果需要扩容或者缩容,只需要重新分配槽位即可。
搭建的集群为:3主6从。
其中内部是1个Master主节点对应2个slave从节点
192.168.184.132:6383> CLUSTER NODESc9d7f4ed642fa2fde013f2b060476b542b9af76e 192.168.184.132:6385@16385 slave af28288480e3398b18402e4475c9ae52c39ea776 0 1651767445299 3 connected9ef7a5bb156de64a969688eade8535399983dd00 192.168.184.132:6389@16389 slave 29a79c9f9a007bf80fdfc2ffaaf1cf27d29396c2 0 1651767443000 10 connected888158ad30d9a173175b115974b9d1cc5b39736e 192.168.184.132:6381@16381 master,fail - 1651767320800 1651767314000 1 disconnected1ff5a2a15526e3d7984b231cf7e47f8f442e4a9e 192.168.184.132:6382@16382 master - 0 1651767444000 2 connected 5461-1092229a79c9f9a007bf80fdfc2ffaaf1cf27d29396c2 192.168.184.132:6386@16386 master - 0 1651767444000 10 connected 0-546092d06bfb428a1358149c209c336152cae3304c66 192.168.184.132:6388@16388 slave af28288480e3398b18402e4475c9ae52c39ea776 0 1651767443000 3 connectedaf28288480e3398b18402e4475c9ae52c39ea776 192.168.184.132:6383@16383 myself,master - 0 1651767443000 3 connected 10923-163835b20d04646f7f38eb57266b81749e565825ab6e5 192.168.184.132:6387@16387 slave 1ff5a2a15526e3d7984b231cf7e47f8f442e4a9e 0 1651767444284 2 connecteda11993ddc7a726e3ad476858fb53bdc97d4834b8 192.168.184.132:6384@16384 slave 1ff5a2a15526e3d7984b231cf7e47f8f442e4a9e 0 1651767446319 2 connected
我们可以看到以前6381的从节点6386变成了Master节点。说明已经进行主从切换了。
docker start redis-node-1
192.168.184.132:6383> CLUSTER NODES
c9d7f4ed642fa2fde013f2b060476b542b9af76e 192.168.184.132:6385@16385 slave af28288480e3398b18402e4475c9ae52c39ea776 0 1651767586000 3 connected9ef7a5bb156de64a969688eade8535399983dd00 192.168.184.132:6389@16389 slave 29a79c9f9a007bf80fdfc2ffaaf1cf27d29396c2 0 1651767586183 10 connected888158ad30d9a173175b115974b9d1cc5b39736e 192.168.184.132:6381@16381 slave 29a79c9f9a007bf80fdfc2ffaaf1cf27d29396c2 0 1651767582247 10 connected1ff5a2a15526e3d7984b231cf7e47f8f442e4a9e 192.168.184.132:6382@16382 master - 0 1651767586000 2 connected 5461-1092229a79c9f9a007bf80fdfc2ffaaf1cf27d29396c2 192.168.184.132:6386@16386 master - 0 1651767588204 10 connected 0-546092d06bfb428a1358149c209c336152cae3304c66 192.168.184.132:6388@16388 slave af28288480e3398b18402e4475c9ae52c39ea776 0 1651767586000 3 connectedaf28288480e3398b18402e4475c9ae52c39ea776 192.168.184.132:6383@16383 myself,master - 0 1651767587000 3 connected 10923-163835b20d04646f7f38eb57266b81749e565825ab6e5 192.168.184.132:6387@16387 slave 1ff5a2a15526e3d7984b231cf7e47f8f442e4a9e 0 1651767585000 2 connecteda11993ddc7a726e3ad476858fb53bdc97d4834b8 192.168.184.132:6384@16384 slave 1ff5a2a15526e3d7984b231cf7e47f8f442e4a9e 0 1651767587192 2 connected
我们可以看到6381变成了从节点(slave),主节点(Master)是6386。
发现6390已经成功加入到集群,并且是Master节点,但是没有被分配槽位,slots为0。需要分配槽位才有用
此时6390的槽位已经全部给了6383,这个时候可以删除6390节点了。xxx1为6390的容器id
来源:
https://blog.csdn.net/weixin_50071998/article/details/124751540
“IT大咖说”欢迎广大技术人员投稿,投稿邮箱:aliang@itdks.com
来都来了,走啥走,留个言呗~
IT大咖说 | 关于版权
由“IT大咖说(ID:itdakashuo)”原创的文章,转载时请注明作者、出处及微信公众号。投稿、约稿、转载请加微信:ITDKS10(备注:投稿),茉莉小姐姐会及时与您联系!
感谢您对IT大咖说的热心支持!