读写分离集群¶
1. 读写分离版本与上一个版本使用上的区别¶
- 读写分离版本对于应用开发人员来说,在代码层面没有任何的改变
- 在代码层面没有改变,仅修改连接字符串的配置开启读写分离分发功能
2. 集群读写分离快速使用示例¶
[TestMethod]
public void TestMethod()
{
using (var connection = new OscarConnection("Server=10.1.203.25;Port=2003;User Id=SYSDBA;Password=szoscar55;Database=OSRDB;READWRITE=true;WAITSYNCREAD=true;"))
{
connection.Open();
using (var command = connection.CreateCommand())
{
// 将分发主机连接(写)
command.CommandText = "drop table if exists ConnectTestTable";
var reader = command.ExecuteReader();
}
using (var command = connection.CreateCommand())
{
// 将分发主机连接(写)
command.CommandText = "create table ConnectTestTable (id int)";
var reader = command.ExecuteReader();
}
using (var command = connection.CreateCommand())
{
// 将分发备机连接(读)
command.CommandText = "select * from ConnectTestTable";
var reader = command.ExecuteReader();
}
using (var command = connection.CreateCommand())
{
// 将分发主机连接(写)
command.CommandText = "insert into ConnectTestTable (id) values (4),(5),(6)";
var reader = command.ExecuteReader();
}
using (var command = connection.CreateCommand())
{
// 将分发备机连接(读)
command.CommandText = "select * from ConnectTestTable";
var reader = command.ExecuteReader();
}
}
}
3. 开启驱动读写分离集群功能¶
- 在连接字符串中添加 READWRITE=true; 或者 RW=true; 或者 DISPATCH=true; 或者 DISTRIBUTED=true 开启 读写分离分发功能.
- 服务器的地址 填写浮动ip 地址, SERVER=浮动IP;
- 其它配置 比如
- 开启备机查询等待数据同步 WAITSYNCREAD=true (保证备注数据一致性)
- 线程级lsn THREADSYNCREAD=true
- 备机分发延迟 SLAVEDELAYINTERVA=10000
- 读操作是否可以分发到非强制同步备机 REQUIREDSYNCREDO=false
- 更多的详细配置请对照下表(连接字符串关键词对应表)
连接字符串格式
"Server=10.1.203.25;Port=2003;User Id=SYSDBA;Password=szoscar55;Database=OSRDB;RW=true;WAITSYNCREAD=true;"
4. 自主控制 SQL 语句分发到主节点还是备用节点¶
在 OscarCommand 类中 属性 DirectToMainSql 和
DirectToSlaveSql 控制SQL语句强制分发到主备节点.
例如
using (OscarCommand command = (OscarCommand) _connect.CreateCommand())
{
command.CommandText = "select * from TransactionTestTable";
command.DirectToMainSql = true; // 强制分发到主机写节点
// command.DirectToSlaveSql = true; // 强制分发到备机读节点
var reader = command.ExecuteReader();
}
5. 事务分发¶
参数
TransactionStrategy 默认为 1,事务中的所有语句都分发到主机;当
TransactionStrategy 设置为
2,事务开始的读语句可以分发到备机,一旦出现写语句,后面的语句都分发到主机.例如
using (var transaction = _connect.BeginTransaction())
{
try
{
using (OscarCommand command = (OscarCommand) _connect.CreateCommand())
{
command.CommandText = "select * from TransactionTestTable";
var reader = command.ExecuteReader();
}
using (var command = _connect.CreateCommand())
{
command.CommandText = "insert into TransactionTestTable (id) values (4),(5),(6)";
var reader = command.ExecuteReader();
}
using (var command = _connect.CreateCommand())
{
command.CommandText = "select id from TransactionTestTable";
var reader = command.ExecuteReader();
}
transaction.Commit();
}
catch
{
transaction.Rollback();
}
}
引用