共享分机注册信息有两种方式
- 集群使用相同的数据库,多个节点实时读取数据
- 优点:使用简单,即使所有节点重启,也能立即从数据库中恢复分机注册数据
- 缺点:对数据库过于依赖,一旦数据库出现性能瓶颈,则会立即影响所有的呼叫
- 是用cluster模块,不使用数据库,通过opensips自带的二进制同步方式
- 优点:不用数据库,消息处理速度快,减少对数据库的压力
- 缺点:一旦所有节点挂掉,所有的分机注册信息都会损失。但是挂掉所有节点的概率还是比较小的。
今天要讲的方式就是通过cluster的方式进行共享注册信息的方案。
假设有三个节点:
- 在其中一个节点上注册的分机信息会同步给其他的节点
- 假设其中节点a重启了,节点a会自动选择b或者c来拉取第一次初始化的分机信息
举例来说:
- 8001分机在b上注册成功
- b把8001的注册信息通过cluster模块通知给a和c
- 8002分机在a上注册成功
- a把8002的注册信息通过cluster模块通知给b和c
- 此时整个集群有两个分机8001和8002
- 节点c突然崩溃重启
- 节点c重启之后,向b发出请求,获取所有注册的分机
- 节点b像节点c推送全量的分机注册信息
- 此时三个节点又恢复同步状态
cluster表设计:
- 空的字段我就没写了,flags字段必须设置为seed, 这样节点重启后,才知道要像哪个节点同步全量数据
id,cluster_id,node_id,url,state,flags
1,1,1,bin:a:5000,1,seed
2,1,2,bin:b:5000,1,seed
3,1,3,bin:c:5000,1,seed
脚本修改:
# 增加 bin的listen, 对应cluster表的url
listen=bin:192.168.2.130:5000
# 加载proto_bin和clusterer模块
loadmodule "proto_bin.so"
loadmodule "clusterer.so"
modparam("clusterer", "db_url", "mysql:xxxx") # 设置数据库地址
modparam("clusterer", "current_id", 1) # 设置当前node_id
modparam("usrloc", "working_mode_preset", "full-sharing-cluster")
modparam("usrloc", "location_cluster", 1) # 设置当前的集群id
其他操作保持原样,opensips就会自动同步分机数据了。