三白为欢 發表於 2020-10-17 21:12:00

.NET Core+MongoDB集群搭建与实战

<p></p><div class="toc"><div class="toc-container-header">目录</div><ul><li>安装 MongoDB<ul><li>apt 直接安装(方法1)</li><li>apt 仓库安装(方法2)</li><li>方法1、2启动 MongoDB</li><li>通过二进制包安装(方法3)<ul><li>安装依赖</li><li>deb 安装 MongoDB</li><li>tgz 安装 MongoDB</li><li>启动 MongoDB</li></ul></li><li>卸载方法<ul><li>apt 卸载方法</li><li>tgz 卸载方法</li></ul></li><li>指定启动的配置<ul><li>通过配置文件</li><li>通过参数</li></ul></li><li>MongoDB 绑定IP、端口<ul><li>测试远程 IP 连接</li></ul></li><li>加上密码验证<ul><li>设置账号密码</li><li>开启登录验证</li></ul></li><li>停止 MongoDB</li></ul></li><li>搭建集群<ul><li>副本集</li><li>故障转移</li><li>方案</li><li>设计实例名称</li><li>如何创建集群</li><li>启动两个实例(配置)</li><li>副本集状态查看</li></ul></li><li>.NET Core 连接 MongoDB</li></ul></div><p></p>
<h2 id="安装-mongodb">安装 MongoDB</h2>
<p>安装 MongoDB 网上有很多教程,MongoDB 官方文档:https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/</p>
<p>笔者这里简单写一下安装过程,笔者使用 ubuntu 系统。</p>
<p>要按照的目标版本:MongoDB 4.4 Community Edition</p>
<p>支持的系统:</p>
<ul>
<li>20.04 LTS (“Focal”)</li>
<li>18.04 LTS (“Bionic”)</li>
<li>16.04 LTS (“Xenial”)</li>
</ul>
<p>更新软件源</p>
<pre><code class="language-shell">sudo apt update
sudo apt upgrade
</code></pre>
<h3 id="apt-直接安装方法1">apt 直接安装(方法1)</h3>
<p>如果你要安装稳定版本,则直接使用一条命令安装:</p>
<pre><code class="language-shell">sudo apt install mongodb
</code></pre>
<p>执行命令检查 MingoDB 的状态:</p>
<pre><code class="language-shell">sudo systemctl status mongodb
</code></pre>
<h3 id="apt-仓库安装方法2">apt 仓库安装(方法2)</h3>
<p>此种方式可以让你安装最新版本的 MongoDB 。</p>
<p><strong>导入包管理系统使用的公钥</strong></p>
<pre><code class="language-csharp">wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
</code></pre>
<p><strong>添加 MongoDB 的仓库源文件</strong></p>
<pre><code class="language-csharp"> /etc/apt/sources.list.d/mongodb-org-4.4.list
</code></pre>
<p><strong>添加 MongoDB 的仓库源地址</strong></p>
<pre><code class="language-csharp"># ubuntu 16.04
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list

# ubuntu 18.04
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list

# ubuntu 20.04
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
</code></pre>
<p><strong>加载 MongoDB 的软件包</strong></p>
<pre><code class="language-shell">sudo apt-get update
</code></pre>
<p><strong>安装最新稳定版本的 MongoDB</strong></p>
<pre><code class="language-shell">sudo apt-get install -y mongodb-org
</code></pre>
<p>如果你想安装指定版本:</p>
<pre><code class="language-shell">sudo apt-get install -y mongodb-org=4.4.1 mongodb-org-server=4.4.1 mongodb-org-shell=4.4.1 mongodb-org-mongos=4.4.1 mongodb-org-tools=4.4.1
</code></pre>
<h3 id="方法12启动-mongodb">方法1、2启动 MongoDB</h3>
<p><strong>执行命令检查 MongoDB 的状态</strong>:</p>
<pre><code class="language-shell">sudo systemctl status mongodb
</code></pre>
<p><strong>启动 MongoDB</strong>:</p>
<pre><code class="language-shell">sudo systemctl start mongod
</code></pre>
<p><strong>开机启动 MongoDB</strong>:</p>
<pre><code class="language-shell">sudo systemctl enable mongod
</code></pre>
<p><strong>查看 MongoDB 版本</strong>:</p>
<pre><code class="language-shell">mongo --version
mongod --version
</code></pre>
<p>注意:由于 Linux/Unix 系统会对文件描述符的数量或者线程数量加以限制,如果安装过程或者启动时报错,需要自行另外查找方法解决,这里不再赘述。</p>
<h3 id="通过二进制包安装方法3">通过二进制包安装(方法3)</h3>
<p>适合网络不会或者离线安装,有 <code>tgz</code>、<code>deb</code> 、<code>source code</code> 等方法安装,这里只使用 <code>tgz</code> 方式。</p>
<h4 id="安装依赖">安装依赖</h4>
<pre><code class="language-shell"># ubuntu 16.04
sudo apt-get install libcurl3 openssl liblzma5

# ubuntu 18.04 &amp; 20.04
sudo apt-get install libcurl4 openssl liblzma5
</code></pre>
<p><strong>选择合适的系统下载二进制包</strong>:</p>
<p>https://www.mongodb.com/try/download/community?tck=docs_server</p>
<p>Package 可以选择包的形式,如 shell(deb)、shell(tgz)。</p>
<p>注意,要在服务器下载的话,就不要点击 Download,而是点击 <code>Copy Link</code> 复制二进制包的下载链接。</p>
<p>请注意下载的软件版本,mongos 、tagz 包含全部功能;</p>
<p>其它的是单独提供 server 或者 client(shell) 功能。</p>
<p>本小节将提供安装 .deb 和 tgz 包的说明,请自行选择要安装的包!(建议直接下载 tgz)。</p>
<p><img src="https://img2020.cnblogs.com/blog/1315495/202010/1315495-20201017210808666-1071566095.png" alt="不同种类的软件包" loading="lazy"></p>
<h4 id="deb-安装-mongodb">deb 安装 MongoDB</h4>
<p>如果下载了 .deb 文件,请使用下面命令安装。</p>
<pre><code class="language-shell">wget {下载地址}
sudo dpkg -i {软件包名}.deb
</code></pre>
<h4 id="tgz-安装-mongodb">tgz 安装 MongoDB</h4>
<p>如果下载了 <code>.tar.gz</code> 文件,请使用下面命令安装。</p>
<pre><code class="language-shell">tar -zxvf mongodb-{版本}.tgz

# 下面是示例
cd mongodb-linux-x86_64-ubuntu1604-4.4.1
... ...
|-- bin
|   `-- mongo
|-- LICENSE-Community.txt
|-- MPL-2
|-- README
`-- THIRD-PARTY-NOTICES
</code></pre>
<p>打开解压的目录,执行:</p>
<pre><code class="language-shell">sudo cp bin/* /usr/local/bin/
# 实际上就是将二进制可执行文件放到 bin 目录
</code></pre>
<h4 id="启动-mongodb">启动 MongoDB</h4>
<p><strong>创建数据存放目录</strong>:</p>
<pre><code class="language-shell">sudo mkdir -p /var/lib/mongo
</code></pre>
<p><strong>创建日志存放目录:</strong></p>
<pre><code class="language-shell">sudo mkdir -p /var/log/mongodb
</code></pre>
<p>如果不是使用 root 用户登录,则需要获取文件权限:</p>
<pre><code class="language-shell"># whoami是你的用户名
sudo chown `whoami` /var/lib/mongo
sudo chown `whoami` /var/log/mongodb
</code></pre>
<p><strong>运行 MongoDB:</strong></p>
<pre><code class="language-shell">mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
</code></pre>
<p>之后终端会提示已经成功启动;也可以查看 <code>/var/log/mongodb/mongod.log</code> 日志文件中的内容确定 MongoDB 的运行情况;</p>
<p><code>cat /var/log/mongodb/mongod.log</code> 日志文件,会发现第一行:</p>
<pre><code class="language-shell">pid=22639 port=27017
</code></pre>
<p>port 即 MongoDB 的连接端口。</p>
<h3 id="卸载方法">卸载方法</h3>
<h4 id="apt-卸载方法">apt 卸载方法</h4>
<p>适合使用 镜像仓库安装的 MongoDB。</p>
<pre><code class="language-shell">sudo apt-get purge mongodb mongodb-clients mongodb-server mongodb-dev
sudo apt-get purge mongodb-10gen
sudo apt-get autoremove
</code></pre>
<p>注:执行过程报错不用管。</p>
<h4 id="tgz-卸载方法">tgz 卸载方法</h4>
<p>适合卸载使用 .tar.gz 安装的包。</p>
<pre><code class="language-shell">rm /usr/local/bin/mongo*
</code></pre>
<h3 id="指定启动的配置">指定启动的配置</h3>
<h4 id="通过配置文件">通过配置文件</h4>
<p>如果前面提到过配置文件 <code>/etc/mongod.conf</code>,如果通过配置文件启动,则会方便很多,使用配置文件启动 MongoDB 的方法:</p>
<pre><code class="language-shell">mongod --config /etc/mongod.conf
</code></pre>
<h4 id="通过参数">通过参数</h4>
<p>通过参数启动 MongoDB 的话,每次启动都比较麻烦:</p>
<pre><code class="language-shell">mongod--bind_ip=0.0.0.0 --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
</code></pre>
<h3 id="mongodb-绑定ip端口">MongoDB 绑定IP、端口</h3>
<p>查看 MongoDB 配置:</p>
<pre><code class="language-shell"># 进入 shell
mongo

# 执行
use admin
db.runCommand( { getParameter : '*' } )
</code></pre>
<p>默认 MongoDB 是本地服务,外界无法访问主机的 MongoDB 服务,这里来配置一下,使其能够被外网访问。</p>
<p>在 MongoDB 启动后,执行以下命令修改配置。</p>
<pre><code class="language-shell"># 绑定所有地址
mongod --bind_ip_all

# 修改端口
mongod --port 27017
</code></pre>
<p>或者停了 MongoDB 服务后,使用以下命令启动:</p>
<pre><code class="language-shell">mongod--bind_ip=0.0.0.0 --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
</code></pre>
<p>或者手动修改 <code>/etc/mongod.conf</code> 配置文件,把其中一段改成 <code>0.0.0.0</code>:</p>
<pre><code class="language-shell"># network interfaces
net:
port: 27017
bindIp: 0.0.0.0
</code></pre>
<p>修改完毕后,需要关闭 MongoDB,再开启,请参考后面 ”停止 MongoDB“ 一节。</p>
<h4 id="测试远程-ip-连接">测试远程 IP 连接</h4>
<p>测试连接指定 IP 和 port 的 MongoDB 服务:</p>
<pre><code class="language-shell">mongo {你的服务器公网IP}:27017
</code></pre>
<h3 id="加上密码验证">加上密码验证</h3>
<h4 id="设置账号密码">设置账号密码</h4>
<pre><code class="language-shell">mongo

# 进入 MongoDB shell 后
use admin
db.createUser({user:"admin",pwd:"123456",roles:[{role:"root",db:"admin"}]})
</code></pre>
<p>如果不生效,请自行找方法解决,这里不再赘述~</p>
<h4 id="开启登录验证">开启登录验证</h4>
<p>然后打开 <code>/etc/mongod.conf</code> 文件,将 <code>#security:</code> 改成:</p>
<pre><code class="language-shell">security:
authorization: enabled
</code></pre>
<p>如果不生效,请自行找方法解决,这里不再赘述~</p>
<h3 id="停止-mongodb">停止 MongoDB</h3>
<pre><code class="language-shell">mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --shutdown
</code></pre>
<h2 id="搭建集群">搭建集群</h2>
<p>按照此方法,再炮制一台服务器就行。</p>
<p>建议使用 docker 一次性搞好,自己手动在物理机上面安装,太折腾了。</p>
<p>接下来,我们要根据官方文档,搭建简单的副本集群。</p>
<p>官方文档地址:https://docs.mongodb.com/manual/replication/</p>
<h3 id="副本集">副本集</h3>
<p>副本集是一组 MongoDB 实例来维护相同数据集。</p>
<p>官网文档解释:一个副本集包含多个数据承载节点和一个仲裁器节点(可选)。在数据承载节点中,只有一个成员被视为主要节点,而其他节点则被视为次要节点。</p>
<p>用一下官方的图:</p>
<p><img src="https://img2020.cnblogs.com/blog/1315495/202010/1315495-20201017211004159-962848062.png" alt="mongoDB副本集" loading="lazy"></p>
<h3 id="故障转移">故障转移</h3>
<p>图中有三台 MongoDB 实例,当 Primary 挂了后,<code>Secondary</code> 可以换掉挂了的服务器,成为新的 Primary。</p>
<p><img src="https://img2020.cnblogs.com/blog/1315495/202010/1315495-20201017211023896-613602242.png" alt="故障转移" loading="lazy"></p>
<p>由于我只有两台服务器,因此只能组双机热备。</p>
<h3 id="方案">方案</h3>
<p><strong>主节点(Primary)</strong></p>
<p>对外接收所有请求,然后将修改同步到所有 Secondary 中。</p>
<p>当 主节点(Primary) 挂了后,其它 Secondary 或者 Arbiter 节点就会重新选举一个主节点出来。</p>
<p><strong>副本节点(Secondary)</strong></p>
<p>副本节点是备胎,数据集跟主节点(Primary)一致,当主节点挂了后,有机会成为正胎(Primary)。</p>
<p><strong>仲裁者(Arbiter)</strong></p>
<p>不保存数据集,也不能成为(Primary)。作用是当主节点挂了后,投票给 Secondary,让 Secondary 成为 Primary。</p>
<p>但是怎么配置原有的 MongoDB 实例,使其成为 Primary - Secondary 集群呢?Google 了很久。</p>
<p>找到 MongoDB 官方的文档:</p>
<p>https://docs.mongodb.com/manual/tutorial/deploy-replica-set/</p>
<h3 id="设计实例名称">设计实例名称</h3>
<p>在 primary 机器和 secondary 机器上,分别打开 <code>/etc/mongod.conf</code> 文件,找到 <code>#</code>replication,设置节点名称。</p>
<pre><code>replication:
replSetName: {名称}
</code></pre>
<p>primary 机器设置 <code>primary</code>,secondary 机器设置 <code>beitai</code>。</p>
<p>replSetName 的作用解释如下:</p>
<p>https://docs.mongodb.com/manual/reference/configuration-options/#replication.replSetName</p>
<p>也可以在启动 MongoDB 时加上 <code>--replSet "beitai"</code> 的参数。</p>
<pre><code>mongod --replSet "beitai" ... ...
</code></pre>
<p><strong>请停止 MongoDB 后,使用长命令的方法启动 MongoDB</strong>。</p>
<p>请在要设置为 Primary 的机器,执行:</p>
<pre><code>mongod --replSet "primary" --bind_ip=0.0.0.0 --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
</code></pre>
<p>请在要设置为 Secondary 的机器,执行:</p>
<pre><code>mongod --replSet "beitai" --bind_ip=0.0.0.0 --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
</code></pre>
<h3 id="如何创建集群">如何创建集群</h3>
<p>必须要做到以下两点配置:</p>
<ul>
<li>Add Members to a Replica Set</li>
<li>Deploy a Replica Set</li>
</ul>
<p>笔者在这里踩了很大的坑,试了很多种方法和配置才成功。</p>
<h3 id="启动两个实例配置">启动两个实例(配置)</h3>
<p>提前说明,如果使用 <code>rs.</code> 指令配置实例,想重新配置,出现 ”"errmsg" : "already initialized"“,可以使用 <code>rs.reconfig()</code> 清除配置。</p>
<pre><code class="language-shell">rsconf = rs.conf()
rsconf.members = [{_id: 1, host: "本机的ip:27017"}]
rs.reconfig(rsconf, {force: true})
</code></pre>
<p>在 Secondary 机器,执行命令停止运行:</p>
<pre><code class="language-shell">mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --shutdown
</code></pre>
<p>重新启动 Secondary 机器:</p>
<pre><code class="language-shell">mongod --replSet "beitai" --bind_ip=0.0.0.0 --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
</code></pre>
<p>设置为 Secondary 节点:</p>
<pre><code class="language-json">rs.initiate(
   {
      _id: "beitai",
      version: 1,
      members: [
         { _id: 0, host : "primary的ip:27017" }
         { _id: 1, host : "secondary的ip:27017" }
      ]
   }
)
</code></pre>
<p>注:id是优先级。</p>
<p>在 primary 机器,执行命令停止运行:</p>
<pre><code>mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --shutdown
</code></pre>
<p>重新启动 primary:</p>
<pre><code class="language-shell">mongod --replSet "beitai" --bind_ip=0.0.0.0 --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
</code></pre>
<p>在 primary 进入 shell:</p>
<pre><code class="language-shell">mongo
</code></pre>
<p>执行命令进行初始化并设置自己为 primary:</p>
<pre><code class="language-json">rs.initiate(
   {
      _id: "primary",
      version: 1,
      members: [
         { _id: 0, host : "primary的ip:27017" },
         { _id: 1, host : "secondary的ip:27017" }
      ]
   }
)
</code></pre>
<p>分别在两个实例打开 mongo shell,执行:</p>
<pre><code>rs.status()
</code></pre>
<p>发现:</p>
<pre><code>beitai:SECONDARY&gt;
...
primary:PRIMARY&gt;
</code></pre>
<p>使用工具连接 MongoDB 并创建一个名为 Test 的数据库:</p>
<p><img src="https://img2020.cnblogs.com/blog/1315495/202010/1315495-20201017211112680-9833465.png" alt="连接MongoDB" loading="lazy"></p>
<h3 id="副本集状态查看">副本集状态查看</h3>
<p>查看复制延迟:</p>
<pre><code class="language-shell">rs.printSlaveReplicationInfo()
</code></pre>
<p>执行结果:</p>
<pre><code class="language-shell">WARNING: printSlaveReplicationInfo is deprecated and may be removed in the next major release. Please use printSecondaryReplicationInfo instead.
source: *.*.*.*:27017
        syncedTo: Sat Oct 17 2020 20:02:49 GMT+0800 (CST)
        0 secs (0 hrs) behind the freshest member (no primary available at the moment)
source: *.*.*.*:27017
        syncedTo: Thu Jan 01 1970 08:00:00 GMT+0800 (CST)
        1602936169 secs (445260.05 hrs) behind the freshest member (no primary available at the moment)

</code></pre>
<h2 id="net-core-连接-mongodb">.NET Core 连接 MongoDB</h2>
<p>.NET 程序要连接 MongoDB ,需要通过 Nuget 包安装 <code>MongoDB.Driver</code> 驱动。</p>
<p>我们来创建一个控制台程序,Nuget 搜索 MongoDB.Driver 并安装,接下来一步步使用连接 MongoDB。</p>
<p>文档地址:https://mongodb.github.io/mongo-csharp-driver/2.10/getting_started/</p>
<p>添加 using 引用:</p>
<pre><code class="language-csharp">using MongoDB.Bson;
using MongoDB.Driver;
</code></pre>
<p>连接 MongoDB</p>
<pre><code class="language-shell">var client = new MongoClient("mongodb://primary的ip:27017,secondary的ip:27017");
</code></pre>
<p>获取数据库</p>
<pre><code class="language-shell">IMongoDatabase database = client.GetDatabase("Test");
</code></pre>
<p>获取文档集合</p>
<pre><code class="language-shell">var collection = database.GetCollection&lt;BsonDocument&gt;("MyCollection");
</code></pre>
<p>插入文档(json)</p>
<pre><code class="language-csharp">            var document = new BsonDocument
            {
                { "name", "MongoDB" },
                { "type", "Database" },
                { "count", 1 },
                { "info", new BsonDocument
                {
                  { "x", 203 },
                  { "y", 102 }
                }}
            };
</code></pre>
<p>其源结构的 json 如下:</p>
<pre><code class="language-json">{
   "name": "MongoDB",
   "type": "database",
   "count": 1,
   "info": {
         x: 203,
         y: 102
   }
}
</code></pre>
<p>将文档插入到集合中:</p>
<pre><code class="language-csharp">            collection.InsertOne(document);
            // 使用异步 await collection.InsertOneAsync(document);
</code></pre>
<p>然后执行程序,一会儿后,打开 MongoDB 管理器,查看集合。</p>
<p><img src="https://img2020.cnblogs.com/blog/1315495/202010/1315495-20201017211139947-1258577128.gif" alt="" loading="lazy"></p>


</div>
<div id="MySignature" role="contentinfo">
    痴者工良(https://whuanle.cn)<br><br>
来源:https://www.cnblogs.com/whuanle/p/13832578.html
頁: [1]
查看完整版本: .NET Core+MongoDB集群搭建与实战