读写分离集群

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. 开启驱动读写分离集群功能

  1. 在连接字符串中添加 READWRITE=true; 或者 RW=true; 或者 DISPATCH=true; 或者 DISTRIBUTED=true 开启 读写分离分发功能.
  2. 服务器的地址 填写浮动ip 地址, SERVER=浮动IP;
  3. 其它配置 比如
    • 开启备机查询等待数据同步 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 类中 属性 DirectToMainSqlDirectToSlaveSql 控制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();
    }
}
引用