11.11。配置基于校验和的同步
默认情况下,不为资源启用基于校验和的同步。要启用它,请将以下行添加到您的资源配置中/etc/drbd.conf:
resource <resource>
net {
csums-alg <algorithm>;
}
...
}
<algorithm>可以是系统内核配置中内核加密API支持的任何消息摘要算法。通常情况下,你应该能够至少可供选择sha1,md5和crc32c。
如果像往常一样对现有资源进行此更改,请drbd.conf与对等方同步,然后在两个节点上运行。drbdadm adjust <resource>
11.12。配置拥塞策略和挂起的复制
在复制带宽变化很大的环境中(如WAN复制设置中的典型情况),复制链接有时会变得拥塞。在默认配置中,这将导致主节点上的I / O阻塞,这有时是不可取的。
相反,在这种情况下,您可以将DRBD配置为挂起正在进行的复制,从而导致主数据库的数据集超前于辅助数据库。在这种模式下,DRBD保持复制通道处于打开状态-从未切换到断开连接模式-但实际上直到真正的带宽再次可用时才进行复制。
以下示例适用于DRBD代理配置:
resource <resource> {
net {
on-congestion pull-ahead;
congestion-fill 2G;
congestion-extents 2000;
...
}
...
}
最好同时设置congestion-fill和 congestion-extents以及pull-ahead选项。
物有所值的congestion-fill是90%
一个好的值congestion-extents是al-extents为受影响的资源配置的90% 。
11.13。配置I / O错误处理策略
DRBD 处理较低级别I / O错误的 策略由该on-io-error选项确定,该选项包括在以下资源disk配置中/etc/drbd.conf:
resource <resource> {
disk {
on-io-error <strategy>;
...
}
...
}
common如果要为所有资源定义全局I / O错误处理策略,当然也可以在本节中进行设置。
<strategy>可能是以下选项之一:
detach
这是默认和推荐的选项。发生较低级别的I / O错误时,该节点将丢弃其后备设备,并以无盘模式继续运行。
pass-on
这导致DRBD向上层报告I / O错误。在主节点上,它会报告给已挂载的文件系统。在辅助节点上,它将被忽略(因为辅助节点没有上层要报告)。
call-local-io-error
调用定义为本地I / O错误处理程序的命令。这要求local-io-error在资源handlers部分中定义相应的命令调用。管理员完全可以自行决定使用调用的命令(或脚本)来实现I / O错误处理local-io-error。
早期的DRBD版本(8.0之前的版本)包含另一个选项panic,每当发生本地I / O错误时,该选项 都会通过内核崩溃将节点从群集中强制删除。虽然该选项不再可用,但可以通过local-io-error/ call-local-io-error接口模仿相同的行为。仅当您完全了解这种行为的含义时,才应这样做。 |
您可以按照以下过程重新配置运行中资源的I / O错误处理策略:
11.14。配置复制流量完整性检查
默认情况下,资源的复制流量完整性检查未启用。要启用它,请将以下行添加到您的资源配置中/etc/drbd.conf:
resource <resource>
net {
data-integrity-alg <algorithm>;
}
...
}
<algorithm>可以是系统内核配置中内核加密API支持的任何消息摘要算法。通常情况下,你应该能够至少可供选择sha1,md5和crc32c。
如果像往常一样对现有资源进行此更改,请drbd.conf与对等方同步,然后在两个节点上运行。drbdadm adjust <resource>
此功能不适用于生产用途。仅在需要诊断数据损坏问题并想查看传输路径(网络硬件,驱动程序,交换机)是否可能有故障时才启用! |
11.15。调整资源
11.15.1。在线成长
如果可以在运行中(在线)生长后备设备,则还可以在运行期间基于这些设备增加DRBD设备的大小。为此,必须满足两个条件:
在所有节点上增加了后备块设备后,请确保只有一个节点处于主状态。然后在一个节点上输入:
# drbdadm resize <resource>
这将触发新部分的同步。从主节点到辅助节点完成同步。
如果您要添加的空间是干净的,则可以使用--assume-clean选项跳过同步其他空间。
# drbdadm -- --assume-clean resize <resource>
11.15.2。离线增长
当DRBD处于非活动状态时,两个节点上的支持块设备都已增长,并且DRBD资源正在使用 外部元数据时,则会自动识别新的大小。无需行政干预。在两个节点上都再次激活DRBD并成功建立网络连接之后,DRBD设备将具有新的大小。
但是,如果将DRBD资源配置为使用 内部元数据,则必须在新大小可用之前将此元数据移动到增长的设备的末尾。为此,请完成以下步骤:
这是一个高级过程。自行决定使用。 |
# drbdadm down <resource>
# drbdadm dump-md <resource> > /tmp/metadata
您必须在两个节点上都执行此操作,并为每个节点使用单独的转储文件。不要将元数据转储到一个节点上,只需将转储文件复制到对等方。这个。将。不。工作。
# drbdadm create-md <resource>
# drbdmeta_cmd=$(drbdadm -d dump-md <resource>)
# ${drbdmeta_cmd/dump-md/restore-md} /tmp/metadata
Valid meta-data in place, overwrite? [need to type 'yes' to confirm]
yes
Successfully restored meta data
本示例使用bash参数替换。它可能在其他shell中工作也可能不工作。SHELL如果不确定当前使用的是哪个shell,请检查环境变量。 |
# drbdadm up <resource>
# drbdadm primary <resource>
11.15.3。在线收缩
仅外部元数据支持在线收缩。 |
在收缩DRBD设备之前,必须收缩DRBD上方的层,即通常是文件系统。由于DRBD无法询问文件系统实际使用了多少空间,因此必须小心,以免造成数据丢失。
是否文件系统可以在网上进行收缩取决于所使用的文件系统。大多数文件系统不支持在线收缩。XFS根本不支持缩小。 |
要在线收缩DRBD,请在压缩位于其顶部的文件系统后,执行以下命令:
# drbdadm resize --size=<new-size> <resource>
您可以对<new-size>使用常规的乘数后缀(K,M,G等)。收缩DRBD之后,还可以收缩包含块的设备(如果它支持收缩)。
在调整较低级别的设备的大小之后 ,发出一个好主意,以便将DRBD元数据真正写到卷末尾的预期空间中。 drbdadm resize <resource> |
11.15.4。离线缩小
如果要在DRBD处于非活动状态时收缩支持块设备,则DRBD将在下一次尝试连接时拒绝附加到该块设备,因为它现在太小了(如果使用了外部元数据),否则将无法查找其元数据(如果使用内部元数据)。要变通解决这些问题,请使用以下过程(如果无法使用 在线收缩):
这是一个高级过程。自行决定使用。 |
# drbdadm down <resource>
# drbdadm dump-md <resource> > /tmp/metadata
您必须在两个节点上都执行此操作,并为每个节点使用单独的转储文件。不要将元数据转储到一个节点上,只需将转储文件复制到对等方。这个。将。不。工作。
# drbdadm create-md <resource>
# drbdmeta_cmd=$(drbdadm -d dump-md <resource>)
# ${drbdmeta_cmd/dump-md/restore-md} /tmp/metadata
Valid meta-data in place, overwrite? [need to type 'yes' to confirm]
Yes
Successfully restored meta data
本示例使用bash参数替换。它可能在其他shell中工作也可能不工作。SHELL如果不确定当前使用的是哪个shell,请检查环境变量。 |
# drbdadm up <resource>
11.16。禁用后备设备刷新
仅在具有备用电池的写缓存(BBWC)的设备上运行DRBD时,才应禁用设备刷新。大多数存储控制器允许在电池电量耗尽时自动禁用写缓存,而在电池耗尽时切换到直写模式。强烈建议启用此功能。 |
在没有BBWC的情况下或在电池耗尽的BBWC上禁用DRBD的冲洗功能可能会导致数据丢失,因此不应尝试。
DRBD允许您分别为复制的数据集和DRBD自己的元数据启用和禁用后备设备刷新。这两个选项均默认启用。如果您想禁用其中一个(或两者都禁用),则可以disk在DRBD配置文件的部分中对此进行设置/etc/drbd.conf。
要为复制的数据集禁用磁盘刷新,请在配置中包含以下行:
resource <resource>
disk {
disk-flushes no;
...
}
...
}
要在DRBD的元数据上禁用磁盘刷新,请包含以下行:
resource <resource>
disk {
md-flushes no;
...
}
...
}
修改资源配置(/etc/drbd.conf当然,并在节点之间同步)之后,可以通过在两个节点上发出以下命令来启用这些设置:
# drbdadm adjust <resource>
如果只有一个发球区具有BBWC [ 10 ],则应将设置移入主持人部分,如下所示:
resource <resource> {
disk {
... common settings ...
}
on host-1 {
disk {
md-flushes no;
}
...
}
...
}
11.17。配置脑裂行为
11.17.1。裂脑通知
DRBD会split-brain在检测到裂脑的任何时候调用处理程序(如果已配置)。要配置此处理程序,请将以下项目添加到您的资源配置中:
resource <resource>
handlers {
split-brain <handler>;
...
}
...
}
<handler>可以是系统上存在的任何可执行文件。
DRBD发行版包含一个安装为的裂脑处理程序脚本/usr/lib/drbd/notify-split-brain.sh。它只是将通知电子邮件发送到指定的地址。要配置处理程序以将消息发送至root@localhost(应该是将通知转发给真实系统管理员的电子邮件地址),请配置split-brain handler以下内容:
resource <resource>
handlers {
split-brain "/usr/lib/drbd/notify-split-brain.sh root";
...
}
...
}
在正在运行的资源上进行此修改(并使节点之间的配置文件同步)之后,无需其他干预即可启用处理程序。DRBD将在下次出现裂脑时简单地调用新配置的处理程序。
11.17.2。自动裂脑恢复策略
将DRBD配置为自动解决因裂脑(或其他)情况导致的数据分歧问题,正在配置潜在的自动数据丢失。了解其中的含义,如果不打算这样做,请不要这样做。 |
您宁愿查看防护策略,仲裁设置,群集管理器集成以及冗余的群集管理器通信链接,从而避免数据出现差异。 |
为了能够启用和配置DRBD的自动裂脑恢复策略,您必须了解DRBD为此提供了多种配置选项。DRBD根据检测到裂脑时主要角色中的节点数来应用裂脑恢复过程。为此,DRBD检查以下关键字,所有这些关键字都在资源的“ net配置”部分中找到:
after-sb-0pri
刚刚检测到脑裂,但是此时资源不在任何主机上都扮演主要角色。对于此选项,DRBD理解以下关键字:
after-sb-1pri
刚刚检测到脑裂,此时资源在一个主机上处于主要角色。对于此选项,DRBD理解以下关键字:
after-sb-2pri
刚刚检测到脑裂,这时资源在两台主机上都扮演主要角色。此选项接受与和和after-sb-1pri除外相同的关键字。discard-secondaryconsensus
DRBD可以理解这三个选项的其他关键字,在这里已将其省略,因为它们很少使用。drbd.conf有关此处未讨论的裂脑恢复关键字的详细信息,请参见的手册页。 |
例如,在双主模式下用作GFS或OCFS2文件系统的块设备的资源可能具有如下定义的恢复策略:
resource <resource> {
handlers {
split-brain "/usr/lib/drbd/notify-split-brain.sh root"
...
}
net {
after-sb-0pri discard-zero-changes;
after-sb-1pri discard-secondary;
after-sb-2pri disconnect;
...
}
...
}
11.18。创建堆叠的三节点设置
三节点设置涉及一个DRBD设备堆叠在另一个设备上。
DRBD版本9.x不推荐使用堆栈,因为可以在一个级别上实现更多节点。有关详细信息,请参见 定义网络连接。 |
11.18.1。设备堆叠注意事项
以下注意事项适用于这种类型的设置:
11.18.2。配置堆叠资源
在以下示例中,节点被命名为“ alice”,“ bob”和“ charlie”,其中“ alice”和“ bob”形成两个节点的群集,而“ charlie”是备用节点。
resource r0 {
protocol C;
device /dev/drbd0;
disk /dev/sda6;
meta-disk internal;
on alice {
address 10.0.0.1:7788;
}
on bob {
address 10.0.0.2:7788;
}
}
resource r0-U {
protocol A;
stacked-on-top-of r0 {
device /dev/drbd10;
address 192.168.42.1:7789;
}
on charlie {
device /dev/drbd10;
disk /dev/hda6;
address 192.168.42.2:7789; # Public IP of the backup node
meta-disk internal;
}
}
与任何drbd.conf配置文件一样,该文件必须分布在群集中的所有节点上(在本例中为三个节点)。请注意,在未堆叠的资源配置中找不到以下额外关键字:
stacked-on-top-of
此选项通知DRBD包含它的资源是堆栈资源。它替换了on通常在任何资源配置中找到的部分之一。不要stacked-on-top-of在较低级别的资源中使用。
协议A 不需要用于堆栈资源。您可以根据应用程序选择DRBD的任何复制协议。 |
图12.单堆叠设置
11.18.3。启用堆叠资源
要启用堆叠资源,首先要启用其较低级别的资源并对其进行升级:
drbdadm up r0
drbdadm primary r0
与未堆叠的资源一样,您必须在堆叠的资源上创建DRBD元数据。使用以下命令完成此操作:
# drbdadm create-md --stacked r0-U
然后,您可以启用堆叠的资源:
# drbdadm up --stacked r0-U
# drbdadm primary --stacked r0-U
之后,您可以在备份节点上启动资源,从而启用三节点复制:
# drbdadm create-md r0-U
# drbdadm up r0-U
为了自动执行堆栈式资源管理,您可以将堆栈式资源集成到群集管理器配置中。有关在由Pacemaker群集管理框架管理的群集中执行此操作的信息,请参阅 在Pacemaker群集中使用堆叠的DRBD资源。
11.19。永久无盘节点
节点在DRBD中可能是永久无盘的。这是一个配置示例,显示了一个具有3个磁盘满节点(服务器)和一个永久性无盘节点(客户端)的资源。
resource kvm-mail {
device /dev/drbd6;
disk /dev/vg/kvm-mail;
meta-disk internal;
on store1 {
address 10.1.10.1:7006;
node-id 0;
}
on store2 {
address 10.1.10.2:7006;
node-id 1;
}
on store3 {
address 10.1.10.3:7006;
node-id 2;
}
on for-later-rebalancing {
address 10.1.10.4:7006;
node-id 3;
}
# DRBD "client"
floating 10.1.11.6:8006 {
disk none;
node-id 4;
}
# rest omitted for brevity
...
}
对于永久性无盘节点,不会分配位图插槽。对于此类节点,无盘状态以绿色显示,因为它不是错误或意外状态。
该DRBD客户端是通过有线方式获取数据的简便方法,但是它不具有持久存储(Persistent Reservations)等任何高级iSCSI功能。 |
11.20。数据再平衡
给定(示例)策略,该数据需要在3个节点上可用,因此您至少需要3台服务器才能进行设置。
现在,随着存储需求的增长,您将遇到对其他服务器的需求。不必同时购买3台服务器,您可以在单个附加节点上重新平衡数据。
图13. DRBD数据重新平衡
在上图中,您可以看到之前和之后的状态:从3个节点与每次三米25TiB的卷(净75TiB),4个节点,净100TiB。
要在整个群集中重新分配数据,您必须选择一个新节点,并选择一个要删除此DRBD资源的节点。
请注意,从当前活动的节点(即DRBD是Primary)中删除资源将涉及迁移服务或作为DRBD客户端在此节点上运行该资源;在次节点中选择一个节点更容易角色。(当然,这并不总是可能的。)
11.20.1。准备位图插槽
在每个具有要移动资源的节点上,您将需要有一个空闲的位图插槽供临时使用。
您可以在drbdadm create-md时间上再分配一个 ,或者只是在配置中放置一个占位符,这样就可以drbdadm看到它应该再保留一个插槽:
resource r0 {
...
on for-later-rebalancing {
address 10.254.254.254:65533;
node-id 3;
}
}
如果需要在现场使用期间使该插槽可用,则必须
在将来的版本中,drbdadm将为您提供快捷方式。最有可能您将能够说出并让内核为您重写元数据。drbdadm resize --peers N |
11.20.2。准备并激活新节点
首先,您必须在新节点上创建基础存储卷(例如使用lvcreate)。然后,可以在配置中的占位符中填充正确的主机名,地址和存储路径。现在,将资源配置复制到所有相关节点。
在新节点上,通过执行以下操作初始化元数据(一次)
# drbdadm create-md <resource>
v09 Magic number not found
Writing meta data...
initialising activity log
NOT initializing bitmap
New drbd meta data block sucessfully created.
11.20.3。开始初始同步
现在,新节点需要获取数据。
这是通过以下方式在现有节点上定义网络连接来完成的:
# drbdadm adjust <resource>
并通过以下方式在新节点上启动DRBD设备
# drbdadm up <resource>
11.20.4。检查连通性
目前,请
# drbdadm status <resource>
在新节点上,并检查是否已连接所有其他节点。
11.20.5。初始同步后
新的主机为UpToDate时,配置中的其他节点之一可以重命名为for-later-rebalancing,并保留以进行另一次迁移。
也许您想对此部分发表评论;尽管这样做有风险,drbdadm create-md对新节点进行操作的位图槽位太少,无法进行下一次重新平衡。 |
重新复制更改的配置,然后通过运行使用它
# drbdadm adjust <resource>
在所有节点上。
11.20.6。打扫干净
现在,在一个拥有最新数据但不再用于该资源的节点上,您可以通过启动以下命令来关闭DRBD设备
# drbdadm down <resource>
现在,下层存储设备已不再使用,可以重新用于其他用途,或者如果它是逻辑卷,则可以通过将其空间返回到卷组lvremove。
11.20.7。结论和进一步步骤
资源之一已迁移到新节点。可以对一个或多个其他资源执行相同的操作,以释放现有群集中两个或三个节点上的空间。
然后,可以配置新资源,因为有足够的节点具有可用空间,可以再次实现三向冗余。
尽管如此,您可能仍想将以上步骤与使用DRBD Manage时的过程进行比较:使用DRBD Manage 重新平衡数据 ...
11.21。配置仲裁
为了避免大脑分裂或副本数据分散,必须配置围栏。最后,所有用于防护的选项都依赖于冗余通信。这可能是将节点连接到对等计算机的IPMI网络接口的管理网络的形式。如果使用crm-fence-peer脚本,则当DRBD的网络链接断开时,Pacemakers通信必须保持可用。
另一方面,仲裁机制采用完全不同的方法。基本思想是,如果可以通信的节点数大于节点总数的一半,则群集分区只能修改复制的数据集。这样的分区的节点具有法定人数。另一方面,没有仲裁的节点需要保证它不会触碰复制的数据集,也不会创建发散的数据集。
在DRBD仲裁执行被通过设置使quorum资源选项majority,all或数值。在何处majority选择上一段中描述的行为。
11.21.1。保证最小的冗余
默认情况下,每个具有磁盘的节点都会在法定选举中获得投票。换句话说,只有无盘节点不计在内。因此,具有两个不一致磁盘的分区将达到仲裁,而具有一个UpToDate节点的分区将在3节点群集中具有仲裁。通过配置quorum-minimum-redundancy此行为,可以更改为仅UpToDate在法定选举中具有投票权的节点。该选项采用与该选项相同的参数quorum。
使用此选项,您表示希望在所有服务启动之前等待最终必要的重新同步操作完成。因此,从某种意义上说,您希望保证数据的最小冗余度超过服务的可用性。财务数据和服务就是一个例子。
考虑下面的5节点群集示例。它要求一个分区至少具有3个节点,其中两个必须为UpToDate:
resource quorum-demo {
quorum majority;
quorum-minimum-redundancy 2;
...
}
11.21.2。仲裁人数不足的诉讼
当运行该服务的节点丢失仲裁时,它需要立即停止对数据集的写入操作。这意味着IO立即开始完成所有有错误的IO请求。通常,这意味着无法正常关机,因为这将需要对数据集进行更多修改。IO错误从块级别传播到文件系统,从文件系统传播到用户空间应用程序。
理想情况下,应用程序只是在出现IO错误的情况下终止。这样,Pacemaker可以卸载文件系统并将DRBD资源降级为辅助角色。如果是这样,则应将on-no-quorumresource选项设置为io-error。这是一个例子:
resource quorum-demo {
quorum majority;
on-no-quorum io-error;
...
}
如果您的应用程序未因第一个IO错误而终止,则可以选择冻结IO并重新启动节点。这是一个配置示例:
resource quorum-demo {
quorum majority;
on-no-quorum suspend-io;
...
handlers {
quorum-lost "echo b > /proc/sysrq-trigger";
}
...
}
11.21.3。使用无盘节点作为决胜局
连接到群集中所有节点的无盘节点可用于打破仲裁协商过程中的联系。
考虑以下两个节点的群集,其中节点A是主要节点,节点B是次要节点:
一旦两个节点之间的连接中断,它们就会失去仲裁,并且群集顶部的应用程序将无法再写入数据。
现在,如果我们向集群添加第三个节点C并将其配置为无盘,我们就可以利用tiebreaker机制。
在这种情况下,当主节点和辅助节点失去连接时,它们仍然可以“看到”无盘仲裁者。因此,主服务器可以继续工作,而辅助服务器将其磁盘降级为“过时”,因此服务不能在那里迁移。
在两个连接失败的情况下,有一些特殊情况。请考虑以下情形:
在这种情况下,平局决胜节点与主节点形成一个分区。因此,主服务器保持仲裁,而辅助服务器已过时。请注意,辅助磁盘状态将为“ UpToDate”,但是由于缺少仲裁而无法将其提升为主磁盘。
让我们考虑一下主连接断开的可能性:
在这种情况下,主服务器将变得不可用,并进入“仲裁暂停”状态。这有效地导致DRBD之上的应用程序收到I / O错误。然后,集群管理器可以将节点B提升为主节点,并使服务在那里运行。
万一无盘决胜局“相互切换”,我们需要避免数据分歧。考虑这种情况:
当主节点突然失去与无盘节点的连接时,主节点和辅助节点之间的连接已失败,并且应用程序继续在主节点上运行。
在这种情况下,无法将任何节点提升为主节点,并且群集无法继续运行。
防止数据差异始终比确保服务可用性优先。 |
让我们看另一种情况:
在这里,应用程序在主服务器上运行,而辅助服务器不可用。然后,决胜局首先失去与主要服务器的连接,然后重新连接至次要服务器。在此必须注意,失去仲裁的节点无法通过连接到无盘节点来重新获得仲裁。因此,在这种情况下,没有节点具有仲裁并且群集停止。
11.21.4。最后一个人站
需要指出的是,正常离开群集的节点与失败节点的计数不同。在这种情况下,优雅地离开意味着离开的节点将其数据标记为过时,并且能够告诉其余节点其数据已过时。
在所有磁盘都已过期的一组节点中,该组中的任何一个都不能升级为Primary [ 11 ]。
这暗示着,如果一个集群除一个节点之外的所有节点都留下,则只要其他所有节点以优美的方式离开,它就可以保持仲裁。如果单个节点不满意,则必须假设所有离开的节点都组成一个分区,并且可以访问最新数据。如果另一个分区可能(可能)大于我自己的分区,则会失去仲裁。
文章浏览阅读201次。泛型学习笔记集合是为了解决数组某些存储限制的特点出现的,但是数组有一个优点就是存放的数据的类型是确定的,但是集合容器在声明阶段存入的对象是什么类型是不确定的,所以在JDK1.5之前只能把元素的类型设计为Object类型,JDK1.5后,出现了泛型。这个时候除了对象的类型是不确定的,存储方式和如何管理等是确定的,因此把元素的类型设计成一个参数,这个类型参数叫做泛型。如:Collection< E>,List< E>,ArrayList< E>…这个< E>就_使用泛型时注意和继承类的区别
文章浏览阅读6.9k次,点赞10次,收藏19次。理论在后面。我们将以下面的例子介绍const变量和static变量的存放位置:static int val_a = 1 ; // 初始化的静态变量 int val_b = 2 ; // 全局变量 const int val_c = 3 ; // const 全局变量 static int val_d ; // 未初始化的静态变量 int val_e ; ..._如何验证const变量存放在符号表中
文章浏览阅读4k次。Rust 编程: 条件编译-FeaturesRust 支持条件编译,可通过两种不同的操作实现:cfg 属性:在属性位置中使用 #[cfg(...)]cfg! 宏:在布尔表达式中使用 cfg!(...)// 根据操作系统引用不同文件的相同模块#[cfg_attr(target_os = "linux", path = "linux.rs")]#[cfg_attr(windows, path = "windows.rs")]mod os;// 函数仅当操作系统是 Linux 的时候_rust features
文章浏览阅读7.7k次,点赞6次,收藏20次。本文转载:http://www.cnblogs.com/jingmoxukong/p/4843776.html[C#]绘制自定义窗体目录去windows除边框标题栏标题栏的相关事件绘制边框绘制阴影 参考资料回到顶部去windows除边框初始窗口样式:将窗口FormBorderStyle属性设为None,就可以去除四周边框_c# 自定义窗体
文章浏览阅读7k次,点赞5次,收藏14次。目录什么是bytes (比特类型)字符串转bytes的函数–encodebytes转字符串的函数–decode什么是比特类型二进制的数据流—bytes一种特殊的字符串字符串前+b标记In [4]: bt = b ' my name is insane'In [5]: type( bt)out[5]: bytesdir(param) 会返回某个数据类型支持的所有函数,比如dir(1)会返回数字类型的所有函数# coding:utf-8a = 'hello insane_python 字符串转换成bytes
文章浏览阅读158次。概述Selector是NIO中实现I/O多路复用的关键类。Selector实现了通过一个线程管理多个Channel,从而管理多个网络连接的目的。Channel代表这一个网络连接通道,我们可以将Channel注册到Selector中以实现Selector对其的管理。一个Channel可以注册到多个不同的Selector中。当Channel注册到Selector后会返回一个Select..._useselector原理
文章浏览阅读5.5k次,点赞35次,收藏82次。[UE4]动态液体材质浅谈戴巍离线实时渲染双修,狡猾的技术美术。公号:戴老师的CG日常已关注238 人赞同了该文章大家好,我是练习UE4时长两年半的TA工具人。最近的项目里大量使用UE4引擎。这引擎更新速度和幅度相当给力,今年发现两年半之前学的知识都已经过时了,很多东西又得重新捡起梳理。所以后面会更新一些UE4相关的内容,于我自己是学习笔记;至于你们怎么看我就不知道了。这一次谈的内容是在UE4中..._ue4 水动力模型
文章浏览阅读9k次,点赞2次,收藏10次。 ios中UIScrollView能很好的实现放大缩小功能,在anroid这里,scrollview并不能很好的支持放大缩小,而对于简单的图片放大,缩小,android可以使用ZoomControls控件来实现一些简单图片放大缩小,移动,,,,当然,直接使用webview来加载图片也是能很好实现图片放大缩小功能的。 ..._安卓子系统 如何放大缩小
文章浏览阅读1.5w次,点赞7次,收藏41次。概率图的并集和交集_numpy 交集
文章浏览阅读1.1k次。题目链接:hdu1796容斥原理介绍题目大意:给出m个数,在1~n(不包括n)之间找出所有能对m个数整除的思路:枚举出所有可能组合,求出每一种组合的最小公倍数,运用容斥原理累加所有情况#include #include #include #include #include using namespace std;#define LL __int64int a[15_hdu1796
文章浏览阅读4.2k次,点赞2次,收藏4次。解决Python连接MySQL8,命令行运行时错误pymysql.err.OperationalError: 1045问题1、MySQL8.0之后的密码验证插件为caching_sha2_password,以前为mysql_native_password。2、在PyCharm中python连接MySQL时以上两种加密方式都可以用,但是在命令提示符中运行出现如下错误:pymysql.err...._pymysql.err.operationalerror: (1045, 'unknown error 1045')
文章浏览阅读553次。java 飞机大战游戏设计 拥有11年以上工作经验,精通java、c#开发语..._java飞机大战课程讲解