数据库分为:关系型数据库(mysql、mariadb)和非关系型数据库(redis等)
mysql主从复制的原理:
主从复制:
mysql复制是将主库的DDL和DML操作通过二进制日志传递到复制服务器(从库)上,然后从库对这些日志重新执行(重做),从而使得主库和从库保持数据一致。
vim /etc/my.conf (主:server-id=1 bin 从:server-id =2)
mysql(8080)复制的优点:
如果主库出现问题,可以快速切换到从库提供服务
可以在从库执行查询操作,降低主库的访问压力。
可以在从库进行备份,以免备份期间影响主库的服务。
基于GTID的主从复制
优点:不用手工设置日志偏移量, 可以很方便地进行故障转移,如果启用log_slave_updates 那么从库不会丢失主库上的任何修改。
缺点:仅支持 MySQL 5.6 之后的版本, 而且不建议使用早期 5.6 版本。
在两边的配置文件/etc/my.cnf 都加上:
gtid_mode=ON
enforce-gtid-consistency=true
proxy实现mysql读写分离
在/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua修改最小连接数和最大连接数,
mysql proxy 会检测客户端连接, 当连接没有超过 max_idle_connections 值时, 不会进行读写分离, 即查询操作会发生到 master 上。
创建脚本 /usr/local/mysql-proxy/conf/mysql-proxy.conf
[mysql-proxy]
user=root
proxy-address=0.0.0.0:3306
proxy-backend-addresses=172.25.254.11:3306 //master
proxy-read-only-backend-addresses=172.25.254.12:3306 //slave
proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
log-file=/usr/local/mysql-proxy/logs/mysql-proxy.log
test3和test4实现主从复制,test2的proxy实现读写分离功能
redis(6379)(6380) 的主从复制及高可用集群的原理:
redis的优点和缺点:
存储在内存中,所以其性能极高;丰富的数据类型、原子性
redis是key-value数据库,无法自己实现独立的高可用,需要借助其他外力或者手动干预进行实现
redis支持各种不同方式的排序.与memcached一样,为了保证效率,数据都是缓存在内存中;区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
主从复制:
一主两备
redis-4.0.8 端口:6379
redis-cli 进入数据库
vim /etc/redis/6379.conf
从数据库配置:
slaveof 主机ip 主机端口(6379)
redis提供了哨兵,实现高可用。sentinel哨兵节点(26379)
哨兵节点进行自主监控主从节点以及其他哨兵节点,当发现主节点挂掉时自动故障转移。
vim /etc/redis/sentinel.conf 给test1、test2和test3都配置master为test1的ip
redis的集群:
最少三个节点,因为投票机制应该满足半数以上的节点认为某个节点是挂掉的,此时才能认为该节点挂掉。
memcache+nginx+php缓存 memcache (11211)
nginx+tomcat+memcache实现session共享 memcache(11211) tomcat(8080) 用到nginx的jsp模块
/usr/local/tomcat/conf/context.xml test1为nginx 配置n1和n2 ,并且test2指定n1,test1指定n2
为了对数据的保存更加牢靠,我们选择交叉存放session的方法,即将访问tomcat1上的数据存放在memcache2中,将访问tomcat2上的数据存放在memcache1中,这样存放,当某个tomcat服务断了之后,访问它的客户session并不会消失,而是存放在了对立的memcache,如果存放session的memcache坏了,那么它的数据会立即切换到另一个memcached中